刚接触C++时,我一直在忙着让我的头脑熟悉复杂的系统,比如指针和解决问题。 我制作了这个简单程序,它将串接char字符串。 但它总是抛出相同的错误:L'buffer太小&&0
。
这是我的密码-
const char* str = "larry";
const char* yo{"is one of the stooges" };
size_t buffer{ std::strlen(str) + std::strlen(yo) + 1 };
std::cout << buffer;
char* buff = new char[buffer];
strcpy_s(buff, strlen(str), str);
strcat(buff, yo);
std::cout << *buff << std::endl;
delete[] buff;
下面是我所要求的程序输出:
27 // the size of buffer
然后程序崩溃。
请指出出了什么问题。 谢谢
根据C标准(K.3.7.1.3 strcpy_s函数)
2 s1和s2都不应是空指针。 s1max不得大于RSize_max。 s1max不应等于零。 s1max应大于strnlen_s(s2,s1max)。 复制不得发生在重叠的物体之间。
那就是你必须写
strcpy_s(buff, strlen(str) + 1, str);
否则,将不会复制str
指向的字符串的终止零。 在这种情况下,下一个调用
strcat(buff, yo);
调用未定义的行为。
strcpy_s
的第二个参数是目标数组的大小,包括0字节。 但是,您传入源字符串的大小,不包括0字节。 strcpy_s
尝试复制0字节,但它无法复制,因为目标数组(如参数所示)可能太小。 将buffer
(不是一个好名字,btw)作为第二个参数传递给strcpy_s
,以正确指示目标大小。