C 突然搞乱二维数组中的值
C suddenly messing up values in 2d array
我的代码:
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;
}
想法是用它们在 int map 中的值替换与字符 'a'、'b'、c' 一致的输入映射。 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 我得到核心转储而不是输出。
我需要解释为什么会这样。
开关中没有 default
大小写,因此当您不处理输入值时,打印时数组未初始化。
第一次循环运行时,有一个'\n'
是前一个scanf()
留下的。 "%c"
说明符确实消耗了它,因此您第一次进入循环时,已经在不询问您的情况下提供了该值,并且由于您没有处理开关中的 '\n'
,因此保留了相应的数组元素未初始化。
改变
scanf("%c", &inp)
至
scanf(" %c", &inp)
它会如您所愿地工作。
此外,以防万一添加
default:
tab[b][a] = 0;
break;
到 switch
,以防止将未初始化的值传递给 printf()
。
我的代码:
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;
}
想法是用它们在 int map 中的值替换与字符 'a'、'b'、c' 一致的输入映射。 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 我得到核心转储而不是输出。 我需要解释为什么会这样。
开关中没有 default
大小写,因此当您不处理输入值时,打印时数组未初始化。
第一次循环运行时,有一个'\n'
是前一个scanf()
留下的。 "%c"
说明符确实消耗了它,因此您第一次进入循环时,已经在不询问您的情况下提供了该值,并且由于您没有处理开关中的 '\n'
,因此保留了相应的数组元素未初始化。
改变
scanf("%c", &inp)
至
scanf(" %c", &inp)
它会如您所愿地工作。
此外,以防万一添加
default:
tab[b][a] = 0;
break;
到 switch
,以防止将未初始化的值传递给 printf()
。