带有strcpy_s的字符串副本

时间:2015-12-02 16:56:42

标签: c++ visual-c++

尝试使用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.那么,出了什么问题?

3 个答案:

答案 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);换句话说,会发生截断

     

[...]

你属于"平等"情况,因此错误。如果你知道你做了什么,你可以忽略它或启用截断。