我有一个 input()
函数,它简单地比较传递给它的字符串(长度为 2 个字符),并通过将该字符串与一些预设字符串进行比较来返回相应的整数:
int input(char *ch){
if(strcmp(ch, "AZ") == 0){
return 1;
}
else if(strcmp(ch, "BY") == 0){
return 2;
}
else if(strcmp(ch, "CX") == 0){
return 3;
}
}
我有一个包含多个测试用例的输入集(每个用例以整数 N
开头,随后的 N
输入包含一些字符串。测试用例以一个值结尾N
为 0
):
2
AZ BY
2
AZ CX
1
AZ
3
AZ CX AZ
4
BY AZ CX BY
0
正确的输出应该是:
1 2 1 3 1 1 3 1 2 1 3 2
然后,我试图运行下面的代码来获取输出:
int main()
{
int i, j, N, array[100];
char ch[2];
while((scanf("%d", &N) == 1) && N != 0){
for(i=0; i<N; i++){
scanf("%s", ch);
array[i] = input(ch);
printf("%d ", array[i]);
}
}
return 0;
}
上面的代码带有准确的输出。但是当下面的代码运行时,输出是错误的:
int main()
{
int i, j, N, array[100];
char ch[2];
while((scanf("%d", &N) == 1) && N != 0){
for(i=0; i<N; i++){
scanf("%s", ch);
array[i] = input(ch);
}
for(j=0; j<N; j++){
printf("%d ", array[j]);
}
}
return 0;
}
第二个片段的输出是:
0 2 0 3 1 0 3 1 0 1 3 2
我什至猜不出这两个片段之间的根本区别是什么,以及为什么这两种情况下的输出不同。在第二个代码中,我使用了 for 循环的相同迭代,我猜数组应该仍然保存在第一个 for 循环中分配的值。没有其他语句在两个 for 循环之间操作 array[]
的值。那么为什么
不同的输出?有人请帮我解决这个问题。
最佳答案
C 中的字符串是一个字符序列,后跟一个终止空字节。因此,要存储两个字符的字符串,您需要一个至少包含 3 个元素的数组。
您的数组只包含 2。因此,当写入空字节时,将 2 个字符的字符串写入数组会超出数组的末尾。写入超过数组末尾会调用未定义的行为。这样做的结果是代码可能看起来运行正确,但看似无关的更改可能会导致结果更改甚至崩溃。
让你的数组至少有 3 个字符长。
char ch[3];
关于c - 数组的奇怪行为是循环内外不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50887990/