使用大小为1和strcat的char数组的问题

时间:2010-01-07 17:53:23

标签: c++ arrays char

好的,我真的对VS2008中的这种行为感到困惑。

此代码..

char data[512] = "";

char c[1] = "";
c[0] = '1';

strcat(data, c);

..导致data设置为此字符串值:1ÌÌÌÌhÿ

当然应该是1

如何确保data仅包含我复制到其中的单个char [](即1)?

为什么strcat()会复制所有垃圾?为什么c甚至包含那些垃圾?

感谢您的帮助

修改:谢谢大家。

3 个答案:

答案 0 :(得分:12)

这里的问题是您将无效值传递给strcat。它期望第二个参数是有效的c字符串值。要有效,它必须是char值的数组/指针,以空终止符(\0)结尾。传递的值不包含空终止符,因此无效。

您需要为字符串值c定义一个有效的空终止符。例如

char c[2];
c[0] = '1';
c[1] = '\0';

答案 1 :(得分:3)

因为strcat()复制了C-String。 C-Strings被'\ 0'终止。因此,当您复制'c'时,它会从那里开始,而不是搜索内存,直到找到包含'\ 0'的内存位置,然后将所有这些复制到数据中。

你需要做的是确保'c'是真正的C-String('\ 0'终止)

char c[2] = {};  // Sets all members to '\0';
c[0]      = '1'; // Sets c[0] to '1' but leaves c[1] as '\0'

// c Is still a C-string as it is a sequence terminated with a '\0' character.

答案 2 :(得分:3)

不,它不应该只是“1”。您的c数组不是C字符串,因为您无法将其终止。当您将不是C字符串的内容传递给strcat时,行为未定义。这就是你在案件中观察到的。

请注意,根本不可能将串行"1"压缩到大小为1的数组中。您需要至少包含2个字符的数组:一个用于'1'字符,另一个用于零终结符字符

您只需将c的声明更改为

即可
char c[2] = ""; 

并且代码将按预期工作(我理解你的意图的方式)。