c - 数组的奇怪行为是循环内外不同的值

标签 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 输入包含一些字符串。测试用例以一个值结尾N0):

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/

相关文章:

c - 数组符号在这个程序中有何不同?

javascript - 为什么我的 for 循环只运行一次 if 语句?

java - 将 IEEE 754 double 转换为字符串的纯 Java 代码

c - 如何用c语言构建左半角金字塔

c - 将指针保存到结构中适当的位置

C 奇怪的宏语法

C 找不到在不同情况下从文件读取数据的工作算法

c++ - 复制期间的字节交换

string - 解决局部对齐的算法

javascript - 我需要为一个简单的图片库创建一个链接数组