C语言,char = char,意外结果

时间:2014-07-10 19:24:58

标签: c vector matrix codeblocks

大家好,并提前感谢任何帮助,情况就是这样:

#define N 12
[..]
char vect[N][2];
char strng[2];
[..]
vect[i][0]=strng[2]; //this two lines are in a simple for cycle 
vect[i][2]=strng[0];

现在,如果我string[2] "c 2" vect[i][0]'2' vect[i][1] 'c'code::blocks vect

我使用"2@"并观看"2À"而不是{{1}},但它也可能是{{1}}。

你能帮帮我吗?我哪里错了?

3 个答案:

答案 0 :(得分:5)

数组索引从零到大小减去一个。所以使用例如strng[2]您访问双项数组中的第三个​​条目。访问数组越界将导致undefined behavior,数据将是不确定的。

你还应该记住,C中的所有字符串都是一个字符,而不是例如strlen,额外的字符是特殊的终结符。因此,如果你想要一个双字符串,你真的需要三个字符:两个用于字符串,一个用于终结符。

答案 1 :(得分:1)

重写这些陈述

vect[i][0]=strng[2]; //this two lines are in a simple for cycle 
vect[i][2]=strng[0];

以下方式

vect[i][0]=strng[1]; //this two lines are in a simple for cycle 
vect[i][1]=strng[0];

如果字符串包含两个字符{'c','2'}。

考虑到数组字符串不能包含字符串文字"c 2",因为您将其定义为

char strng[2];

即它只能包含两个字符。

如果您希望数组确实包含"c 2",那么您必须将其定义为

char strng[3];

char strng[4];

如果你想包括终止零。

在这种情况下,您可以写

vect[i][0]=strng[2]; //this two lines are in a simple for cycle 
vect[i][1]=strng[0];

答案 2 :(得分:0)

假设strng字面上包含“c 2”,那么你的记忆就是问题。 strng [2]包含3个细胞iirc。 2用于保持字符,然后是空终止符(即\ 0)。所以当你尝试访问strng [2]时,(你不能因为你只能去N-1个单元格,其中N是为它分配的数字)它包含未定义的结果,因为它不会被终止而你会超越你分配的记忆