好的,我真的对VS2008中的这种行为感到困惑。
此代码..
char data[512] = "";
char c[1] = "";
c[0] = '1';
strcat(data, c);
..导致data
设置为此字符串值:1ÌÌÌÌhÿ
当然应该是1
?
如何确保data
仅包含我复制到其中的单个char [](即1
)?
为什么strcat()
会复制所有垃圾?为什么c
甚至包含那些垃圾?
感谢您的帮助
修改:谢谢大家。
答案 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] = "";
并且代码将按预期工作(我理解你的意图的方式)。