尝试使用strcpy_s
char foo[10]; // a buffer able to hold 9 chars (plus the null)
char bar[] = "A string longer than 9 chars";
strcpy_s( foo, 10, bar );
得到断言:
Expression: (L"Buffer is too small" && 0)
无法理解原因。 foo
有10个字符的空间,第二个参数是10.那么,出了什么问题?
答案 0 :(得分:0)
errno_t strcpy_s(
char *strDestination,
size_t numberOfElements,
const char *strSource
);
strcpy_s函数将strSource地址中的内容(包括终止空字符)复制到strDestination指定的位置。目标字符串必须足够大以容纳源字符串及其终止空字符。如果源字符串和目标字符串重叠,则strcpy_s的行为是未定义的。
从MSDN文档中,如果目标不够大,您将收到错误。
答案 1 :(得分:0)
这是预期的行为
在您拥有的文档中:
numberOfElements 缩写和多字节函数的char单位的目标字符串缓冲区的大小,以及宽函数的wchar_t单位。
所以第二个参数是目标缓冲区的大小。函数尝试从源中复制所有字符。
如果要使用* _s函数复制尽可能多的元素,请考虑使用:
strncpy_s(foo, sizeof(foo)/sizeof(foo[0]), bar, _TRUNCATE);
答案 2 :(得分:0)
您正在编写缓冲区可能包含的字符数。如上所述in the documentation:
2)与(1)相同,但它可能会破坏目的地的其余部分 具有未指定值的数组以及以下错误 在运行时检测到并调用当前安装的约束 处理函数:
[...]
destsz小于或等于strnlen_s(src,destsz);换句话说,会发生截断
[...]
你属于"平等"情况,因此错误。如果你知道你做了什么,你可以忽略它或启用截断。