数组的奇怪行为作为循环内外的不同值

时间:2018-06-16 12:41:15

标签: c arrays string

我有一个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循环的相同迭代,我想,数组仍然应该保存在1st for循环中分配的值。没有其他语句在两个for循环之间操纵array[]的值。那么为什么 不同的输出?有人请帮我解决这个问题。

1 个答案:

答案 0 :(得分:3)

C中的字符串是一个字符序列,后跟一个终止空字节。因此,要存储两个字符的字符串,您需要一个至少3个元素长的数组。

您的数组只保留2.因此,在写入空字节时,向数组写入2个字符的字符串将写入数组的末尾。写入数组的末尾会调用未定义的行为。这样做的结果是代码可能看起来运行正常,但看似无关的更改可能导致结果发生变化甚至崩溃。

让你的数组至少有3个字符。

char ch[3];