C编程:用于循环和中断

时间:2016-08-11 06:55:53

标签: c arrays for-loop multidimensional-array break

任何人都可以告诉我为什么每当我按下字母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;
}

4 个答案:

答案 0 :(得分:2)

scanf("%c",&a[i][j]);更改为scanf(" %c",&a[i][j]);

这允许在扫描角色之前绕过任何空格。

答案 1 :(得分:1)

您的代码中存在两个问题:

  • 第一个已被指出 Rishikesh Raje:您需要在scanf()命令中添加一个空格,以便占用扫描的“\ n”字符。

  • 然后,您扫描字符(%c)并尝试将它们存储在一个int数组中。使用

    char a[N][M];
    

    代替。我的gcc会对你错误的代码发出警告。其他编译器可能会默默地忽略它。

    然而,在小端环境(像PC一样)中,我们可以想到:存储在int变量地址的char应该产生相同的值。但是,char值只占用一个字节,其余字节(3个或更多)保持未初始化。如果之前有零字节,则a[i][j]将为'X',否则,它将是一些随机数。

    这解释了行为,我认为你观察到:程序在某些'X'处随机停止,但并非总是如此。

答案 2 :(得分:0)

将数组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]);

答案 3 :(得分:0)

将其设为char数组而不是int数组

${err^}

而不是,

char a[N][M];