我的目标是生成一个具有正确数量斑点的新数组,并将一个旧的字符数组复制到其中。
使用strcpy_s时,将引发异常。我无法弄清楚为什么会引发异常,该异常指出Buffer太小。我不能使用向量或字符串。如何使用strcpy_s和char数组解决此问题?
char str[4] = { 't', 'e', 's', 't' };
int allocated = 4;
char * reservedString = new char[allocated]();
strcpy_s(reservedString, allocated, str);
编辑: 更改我的代码以将一个代码添加到数组中,会给我同样的“缓冲区太小”异常。
char str[4] = { 't', 'e', 's', 't' };
int allocated = 4;
char * reservedString = new char[allocated+1]();
strcpy_s(reservedString, allocated, str);
编辑2: 正如有人评论的那样,str需要设置为5,并包含一个空终止符。谢谢你,这解决了我的问题。
更新的代码:
char str[5] = { 't', 'e', 's', 't', '\0'};
int allocated = 5;
char * reservedString = new char[allocated]();
strcpy_s(reservedString, allocated, str);
答案 0 :(得分:1)
char str[4] = { 't', 'e', 's', 't' };
是内存中的4字节数组。它不是字符串,并且完全是随机的,在这4个字节之后将出现“尾随”零,并且在两者之间还有任意数量的其他数据。
但是,strcpy_s()
希望复制一个以零结尾的字符串,它只是检查源字符串是否适合目标而已。不会,这就是为什么会出现错误。
[...]在运行时检测到以下错误,并调用当前安装的约束处理程序函数:
* src或dest是空指针
* destsz为零或大于RSIZE_MAX
* destsz小于或等于strnlen_s(src,destsz);换句话说,会被截断
*源字符串和目标字符串之间会发生重叠
您获得了第三个,则“垃圾”字节将被截断。
答案 1 :(得分:1)
您需要五个字符来存储以零结尾的字符串<system.web>
<compilation targetFramework="4.7.2"></compilation>
<httpRuntime targetFramework="4.7.2" />
</system.web>
。您的"test"
数组只有四个字符,没有零终止符。如果您想要一个零终止符,请这样声明:
str
那你当然需要
char str[] = "test";
然后:
int allocated = 5;
答案 2 :(得分:1)
char * reservedString = new char[allocated];
strcpy_s(reservedString, allocated, str);
不是字符串。字符串是由NUL终止的非NUL字符序列。
您应该将缓冲区的大小传递给strcpy_s()
,而不是最大字符串大小(减小一倍)。
也就是说,如果您完全使用str
。 You shouldn't.
使用strcpy()
,或者您已经拥有确切的大小,memcpy()
或std::copy_n()
。
作为附带说明,将内存归零只是为了转身并覆盖它是毫无意义的浪费。
答案 3 :(得分:0)
您没有分配适当的内存:
char str[4] = { 't', 'e', 's', 't' };
它分配5个字节,每个字符分配4个字节,再加上空终止符。---
要做:
char str[4] = { 't', 'e', 's', 't' };
char * reservedString = new char[5]();
strcpy_s(reservedString, allocated, str);
或者:
char str[4] = { 't', 'e', 's', 't' };
char * reservedString = new char[5]();
strcpy(reservedString, str);