代码之家  ›  专栏  ›  技术社区  ›  UkFLSUI

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

  •  1
  • UkFLSUI  · 技术社区  · 7 年前

    我有一个 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循环中分配的值。没有其他语句在操纵 array[] 在两个for循环之间。那么,为什么 不同的输出?有人请在这个问题上帮助我。

    1 回复  |  直到 7 年前
        1
  •  3
  •   dbush    7 年前

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

    你的数组只能容纳2个。因此,当写入空字节时,向数组写入2个字符的字符串会超过数组的结尾。超过数组结尾写入将调用未定义的行为。这样做的结果是,代码可能看起来运行正常,但看似无关的更改可能导致结果更改,甚至崩溃。

    使数组至少有3个字符长。

    char ch[3];