使用 strcat 追加字符数组不起作用
Appending character arrays using strcat does not work
有人能告诉我这段代码有什么问题吗???
char sms[] = "gr8";
strcat (sms, " & :)");
sms
是一个大小4
1 的数组。而且您正在附加更多的字符文字,这些文字超出了数组,因为数组最多可容纳 4
个字符,这些字符已经被 g, r, 8,
占用。
1.顺便问一下,为什么正好是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 个字符的 char 数组,"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 个字符并损坏堆栈。
- 为什么我的数组双精度函数不起作用?
- 当我使用自定义类型创建动态数组时,即使使用字符串,它似乎也不起作用
- C++ - 块不移动,我的数组不起作用
- 字符数组不起作用:C++
- 使用 cin、if 语句和数组不起作用
- 循环中的矢量到数组不起作用
- 标准::矢量数组不起作用
- 二进制树数算法不起作用
- 四元数旋转不起作用
- CPP / JUCE 音频编程框架 - 滑块数组不起作用 - 单个滑块工作
- 在 gcc 中显示字符数组不起作用
- 字符串到字符数组不起作用
- C++随机字符串数组不起作用
- 为什么这个指针算术在 2D 数组上起作用
- 字符赋值数组不起作用
- 如果C++数组不起作用
- 删除动态 2D 数组不起作用
- 通过strftime从结构复制到数组不起作用
- 四元数旋转不起作用
- 使用 strcat 追加字符数组不起作用