C 编程:for 循环和 break

C Programming : for loop and 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;
}

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

这允许在扫描字符之前绕过任何空格。

你的代码有两个问题:

  • 第一个已经指出了 Rishikesh Raje:您需要在 scanf() 命令中添加一个 space 才能吃掉扫描的“\n”字符。

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

    char a[N][M];
    

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

    不过,在小端环境(如 PC 环境)中,人们可能会认为:存储在 int 变量地址处的 char 应该产生相同的值。但是,char-value 只占用一个字节,其余字节(3 个或更多)保持未初始化状态。如果之前有零字节,那么 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];