谁能告诉我为什么每当我按下字母X时循环不退出?如何使程序不获得退格值并进入数组?
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#define N 2
#define M 4
int main()
{
int i,j,a[N][M];
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
scanf("%c",&a[i][j]);
if(a[i][j]=='X')
break;
}
if(a[i][j]=='X')
break;
}
return 0;
}
将scanf("%c",&a[i][j]);
改为scanf(" %c",&a[i][j]);
这允许在扫描字符之前绕过任何空格。
你的代码有两个问题:
-
第一个已经由Rishikesh Raje:你需要在scanf()命令中添加一个空格,以便吃掉扫描的"n"字符。
-
然后,扫描字符(%c)并尝试将它们存储在int-array中。使用
char a[N][M];
。我的gcc会对你的错误代码发出警告。其他编译器可能会忽略这个。
然而,在小端环境中(如PC),人们可能会认为:存储在int变量地址的字符应该产生相同的值。但是,char-value只占用一个字节,其余字节(3个或更多)保持未初始化。如果之前有0字节,那么
a[i][j]
将是'X',否则将是某个随机数。这解释了行为,我想你观察到:程序在一些'X'随机停止,但并不总是。
将数组a的类型从int改为char
int i,j,a[N][M];
改为
int i,j;
char a[N][M];
通常gcc也会警告你:
so.c: In function ‘main’:
so.c:16:9: warning: format ‘%c’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
scanf("%c",&a[i][j]);
让它成为char数组而不是int数组
char a[N][M];
的
int a[N][M];