大家好,并提前感谢任何帮助,情况就是这样:
#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}}。
答案 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是为它分配的数字)它包含未定义的结果,因为它不会被终止而你会超越你分配的记忆