Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何避免strcpy_缓冲区过小_C++_C_Char - Fatal编程技术网

C++ 如何避免strcpy_缓冲区过小

C++ 如何避免strcpy_缓冲区过小,c++,c,char,C++,C,Char,我需要将std::string数据复制到一个字符数组中。字符串的长度是可变的,但字符数组的长度是固定的 const int SIZE = 5; char name[SIZE]; std::string data = "1234567890"; strcpy_s(name, 5, data.c_str()); //causes a buffer is too small assertion strcpy_s(name, 11, data.c_str());//copies fine (leng

我需要将
std::string数据
复制到一个字符数组中。字符串的长度是可变的,但字符数组的长度是固定的

const int SIZE = 5;

char name[SIZE];
std::string data = "1234567890";

strcpy_s(name, 5, data.c_str()); //causes a buffer is too small assertion
strcpy_s(name, 11, data.c_str());//copies fine (length of data plus null)
strcpy_s(name, sizeof(data), data.c_str()); // copies fine
如何每次仅安全复制阵列的长度?不获取断言,也不导致缓冲区过度运行

我应该每次都这样做吗

std::string toCopy = data.substr(0,SIZE-1);
strcpy_s(name, toCopy.c_str());

下面返回一个ERANGE结果,因为您必须为终止的NULL字符留出空间。变量“data”包含10个元素。当strcpy_s到达约束“5”时,它找不到终止NULL并返回ERANGE

strcpy_s(name,5,data.c_str())

strcpy_s函数复制strSource地址中的内容, 包括终止的空字符,到 由strDestination指定。目标字符串必须大 足以容纳源字符串及其终止的空字符。 如果源和目标 字符串重叠

替代方法

  string data = "0123456789";
  int SIZE = 5;
  char name[SIZE];

  size_t length = data.copy( name, 0, 5 );
  buffer[ length ] = '\0';
\u TRUNCATE一起使用

例如:

strncpy_s(name, data.c_str(), _TRUNCATE);

将尽可能多地复制以填充
名称
缓冲区,同时仍考虑空终止(与传统的strncpy不同)。

如果这是C++11,您可以只使用字符串的缓冲区。是的,它的C++11。你能给我一个例子来说明你的意思吗?如果你的意思是“mstrcpy_s(name,data.c_str())”,这会给我带来我想要避免的断言错误(或根据需要使用子字符串),而不是使用C字符串。当您需要字符指针时,请使用
&s2[0]
作为可修改的指针,直到最后一个空终止符之前,或者使用
c_str()
作为不可修改的指针。谢谢您,这对我很有用。我有足够的空间放字符串,但没有复制
nullchar
。非常奇怪的行为,当然还有奇怪的错误信息。