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函数(该函数也可以指定拷贝的数量)代替。