在VC2005之后,使用字符串拷贝函数strcpy会提示该函数不安全,将来会被抛弃类似这样的信息。所以一般都会改用
strcpy_s函数代替。
有时会出现这样的提示错误:“buffer is too small …… ”
代码示例:
char *str = "abcd"
char *des = new char [strlen(str)+1)];
strcpy_s(des,strlen(str),str);//提示错误……buffer is too small
errno_t strcpy_s(
char *strDestination,
size_t numberOfElements,
const char *strSource
);
问题在于自己之前对函数的第二个参数理解有偏差。即size是谁的大小?
这个大小显然不能是目的空间的容纳大小,但是要满足 size <= size(dest);
这个大小也不能小于源内容的大小(上面示例即证明)。
因此这个大小应该是不小于源内容的大小(包括字符串的结束字符)。即 size(src) <= size <= size(dest)
经过试验:如果size超过了dest的空间大小,并不会提示debug错误信息。如果小于src空间大小 则会提示上述的错误。
strlen(...)该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。
strcpy_s(str2, sizeof(str1)+1, str1);
strcpy_s(str2, strlen(str2), str1);
strcpy_s(str2, sizeof(str2), str1);
以上均会出现如下的错误
只有
strcpy_s(str2, strlen(str1)+1, str1);
这种才可以正常运行
strlen() 不包括'\0',所以应该加1。