C 突然搞乱了二维数组中的值

问题描述 投票:0回答:1

我的代码:

int main(){
    int n;
    scanf("%d", &n);
    int a;
    int b;
    char inp;
    int zx;
    int zy;
    int tab[n][n];      
    for(a = 0; a < n ; a++){
        for(b = 0; b < n; b++){
            scanf("%c", &inp);          
            switch(inp){
                case 'a':
                    tab[b][a] = 6;
                    //printf("%d\n", tab[b][a]);
                    break;
                case 'b':
                    tab[b][a] = -1;
                    //printf("%d\n", tab[b][a]);
                    break;
                case 'c':
                    tab[b][a] = 9;
                    zx = b;
                    zy = a;
                    //printf("%d\n", tab[b][a]);
                    break;
            }
        }
    }
    for(a = 0; a < n ; a++){
        for(b = 0; b < n; b++){
            printf("%d ", tab[b][a]);
        }
        printf("\n");
    }   
    return 0;   
}

这个想法是将由字符 'a'、'b'、c' 组成的输入映射替换为 int Map 中的值。 a = 6,b = -1,c = 9。

所以输入像

5
aacbb
ababa
aaaaa
aaabb
bbbbb

应该输出类似

669-1-1
6-16-16
66666
666-1-1
-1-1-1-1-1

当我在二维数组中输入值时,一切似乎都正常。带注释的 printf 值一切正常,但是当我尝试输出整个地图时,它就像:

622671 6 6 9 -1
6 -485498561 6 -1 6
-1 6 564564 6 6
6 6 6 4541512341 -1
-1 -1 -1 -1 564231

这显然是完全错误的。在 Linux 中,我得到的是核心转储而不是输出。 我需要一个解释为什么会发生这种情况。

arrays c
1个回答
1
投票

开关中没有

default
大小写,因此当您不处理输入值时,打印数组时数组未初始化。

循环第一次运行时,会出现前一个

'\n'
留下的
scanf()
"%c"
说明符确实会消耗它,因此您第一次进入循环时,该值已经在没有询问您的情况下提供了,并且由于您没有在开关中处理
'\n'
,因此相应的数组元素未初始化。

改变

scanf("%c", &inp)

scanf(" %c", &inp)

它会按照你的预期工作。

还有,以防万一添加

default:
    tab[b][a] = 0;
    break;

switch
,以防止将未初始化的值传递给
printf()

© www.soinside.com 2019 - 2024. All rights reserved.