C scanf()问题

C scanf()问题,c,scanf,C,Scanf,我是新来C的,我一辈子都搞不清楚我到底做错了什么。第一个scanf工作正常,变量在读入时被打印出来。第二个scanf似乎没有正确读取输入。输入的格式为“char int”,即b 4 当我打印opb x和y时,opb=“”,x=13238272,y=0。 有什么想法吗?……注意我在问题下面删掉了代码 int main(void) { /*initialize variables*/ int width, height; char op; /*grid input*/ scanf("%c %d

我是新来C的,我一辈子都搞不清楚我到底做错了什么。第一个scanf工作正常,变量在读入时被打印出来。第二个scanf似乎没有正确读取输入。输入的格式为“char int”,即b 4
当我打印opb x和y时,opb=“”,x=13238272,y=0。 有什么想法吗?……注意我在问题下面删掉了代码

int main(void)
{

/*initialize variables*/
int width, height;
char op;

/*grid input*/
scanf("%c %d %d", &op, &width, &height);

/*check conditions*/
if (op != 'g' || width>100 || height>100 || width*height<10 || width<1 || height<1) {
    printf("grid-error\n");
    return 0;
}

/*initialize grid elements*/
int grid[width][height];
char printGrid[width][height];

/*create grid elements*/
int i, j;
for (i=0; i<height; i++) {
    for (j=0; j<width; j++) {
        grid[j][i] = 0;
        printGrid[j][i] = '*';
    }
}

/*print successful creation*/
printf("%c %d %d \n", op, width, height);

int k;
for (k = 0; k<10; k++) {
    /*initialize variables*/
    int x, y;
    char opb;

    /*mine input*/
    scanf("%c %d %d", &opb, &x, &y);

    /*check conditions*/
    if (opb != 'b' || x<0 || y<0 || x>(width-1) || y>(height-1) || grid[x][y] == 9) {
        printf("mine-error\n");
        return 0;
    }
int main(无效)
{
/*初始化变量*/
int宽度、高度;
char op;
/*网格输入*/
扫描频率(“%c%d%d”、&op、宽度和高度);
/*检查条件*/

如果(op!=“g”| width>100 | height>100 | width*height,我怀疑问题在于输入中没有处理换行字符。结果是
opb
实际上是一个换行字符(虽然看起来像一个空格),而且
x
y
根本不被读取(即,它们保留了初始化时使用的值)

要解决此问题,请尝试将换行添加到两个扫描中。即:

scanf("%c %d %d\n", &op, &width, &height);
后来

scanf("%c %d %d\n", &opb, &x, &y);

我认为最简单的方法是在第二次扫描时将空格放在%c之前。如果不使用空格,它将使用第一个符号。也就是说,换行符。空格使%c使用第一个符号,而不是空格或制表符。因此:

scanf(" %c %d %d", &op, &x, &y);

您应该检查
scanf()
的返回值,因为这是您知道是否存在格式错误的唯一方法。似乎存在格式错误(因为它没有返回3),这是怎么回事?@user445559:我马上想到的一件事是,
%c
将读取下一个可用字符-即使它是读取前一行后留下的空格或换行符。一般来说,将输入作为行读取并使用
sscanf()更安全
解析它们。唯一的问题是我们被指示使用scanf。所以我只是手动捕获错误的输入,听起来不像是一个脾气暴躁的老geekosaur或其他什么,但如果这是他们最近教的……谢谢,我试过了,但现在它只是挂起在第一个scanf(),所以输入:“g 10”它会转到下一行,直到我按ctrl+d键,然后按应该的方式继续。是的,我相信这是由于键盘输入的缓冲方式。如果您将第一次扫描改回
scanf(“%c%d%d”、&op、&width、&height);
并将第二次扫描改回
scanf(“\n%c%d%d”、&opb、&x、&y);
它不会挂起。关键是要适当地处理空白字符。是的,这就是问题所在,但我使用了一个空格来修复它,用于以下扫描并删除了\n。例如scanf(“%c%d%d”,&op,&width,&height);以及稍后的scanf(“%c%d%d”,&opb,&x,&y);谢谢大家的帮助。我不相信“%c”忽略空白。