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
。非常奇怪的行为,当然还有奇怪的错误信息。