繁体   English   中英

使用strcat追加字符数组不起作用

[英]Appending character arrays using strcat does not work

有人可以告诉我这段代码有什么问题吗???

char sms[] = "gr8";  
strcat (sms, " & :)");

sms是一个大小为4 1的数组。 并且你要追加更多的字符文字,这些字符串会超出数组,因为数组最多可容纳4字符,这些字符已被g, r, 8, \\0占用。

顺便问一下,为什么4呢? 答:因为最后有一个空字符!

如果你提到如下所示的数组大小,那么你的代码是有效且定义良好的。

char sms[10] = "gr8";  //ensure that size of the array is 10
                       //so it can be appended few chars later.
strcat (sms, " & :)");

但是C ++为您提供了更好的解决方案:使用std::string作为:

#include <string>  //must

std::string sms = "gr8";
sms += " & :)"; //string concatenation - easy and cute!

是的,额外的角色没有空间。 sms[]仅分配足够的空间来存储初始化的字符串。

使用C ++,更好的解决方案是:

std::string sms = "gr8";
sms += " & :)";

您正在将数据复制到未分配的内存中。

当你这样做: char sms[] = "gr8"; 你创建一个包含4个字符的字符数组,“gr8”加上字符串末尾的0字符。

然后尝试使用strcat调用将额外的字符复制到数组中,超出数组的末尾。 这会导致未定义的行为,这意味着会发生不可预测的事情(程序可能会崩溃,或者您可能会看到奇怪的输出)。

要解决此问题,请确保要复制字符的数组足以包含所有字符,并且不要忘记最后的0字符。

在C中,数组不会自动增长。

sms具有特定的长度(在这种情况下为4个字母,终止为NULL)。 当你调用strcat ,你试图将字符附加到超过其长度的数组。

这是未定义的行为,会破坏您的程序。

如果您已经分配了一个足够大的数组来包含两个字符串,那么你可以:

char sms[9] = "gr8";
strcat (sms, " & :)");

C ++对C的数组(基本上)有相同的限制。 但是,它提供了更高级别的工具,因此您不必在很多时候处理数组,例如std::string

#include <string>

// ...

std::string sms = "gr8";
sms += " & :)";

这个更好的原因是你不必提前知道你的字符串有多长。 C ++将为您增加内存中的底层存储。

字符数组的缓冲区溢出 ,然后崩溃到某处!

你的短信缓冲区长度只有4个字符。 strcat将在其末尾复制5个以上的字符并破坏堆栈。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM