strcpy和strcpy_s函数

最近有同学在编写作业时,用了字符串拷贝库函数strcpy,被编译器提示不安全,要求用strcpy_s代替。

一个典型的自定义strcpy函数代码可能如下:


char * mystrcpy(char *des , const char *src)
{
    char *t = des;
    while(*des++ = *src++)
        ;
    return t;
}

这个代码的问题在于如果des指向的空间不足以存放字符串src的内容,就可能会导致数据冲突或程序崩溃。

在高版本的vs当中,微软推出了更安全的strcpy_s函数。其函数声明为:

三个参数版本
errno_t strcpy_s(
    char *strDestination,
    size_t numberOfElements,
    const char *strSource
);
两个参数版本
template <size_t size>
errno_t strcpy_s(
    char (&strDestination)[size],
   const char *strSource
); // C++ only

其中三个参数的版本可以为c/c++通用,需要程序员主动指明可接受赋值的空间大小,这样避免只传递指针而无法控制复制长度的问题,通用性较强;而两个参数的版本使用了模板和对数组的引用技术,只能对c++使用,而且第一个参数要求必须是字符数组(不能是字符指针),否则无法运行。

不过这两个函数不是c++标准库函数,在linux环境下需要进行移植或者用strncpy函数(该函数也可以指定拷贝的数量)代替。

Leave a Comment

电子邮件地址不会被公开。 必填项已用*标注