C语言中scanf()函数的问题

3

我是C语言的新手,但无论如何我都无法弄清楚我的错误在哪里。第一个scanf工作正常,变量在读入时被打印出来。第二个scanf似乎没有正确读取输入。输入格式为"char int int",例如b 4 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;
    }

你应该检查 scanf() 的返回值,因为这是唯一的方法,你才能知道是否存在格式错误。 - geekosaur
1
似乎出现了格式错误(因为它没有返回3),这里发生了什么? - Milk
1
@user445559:我一开始想到的一件事是,%c会读取下一个可用字符,即使它是空格或者是从上一行读取后剩余的换行符。一般来说,更安全的做法是将输入读取为行,并使用sscanf()进行解析。 - geekosaur
唯一的问题是我们被指示使用scanf。所以我只是手动捕获错误输入。 - Milk
不想听起来像一个脾气暴躁的老古董程序员,但如果这就是他们现在教的东西... - geekosaur
2个回答

4

我怀疑问题在于你没有处理输入中的换行符。结果是opb实际上是一个换行符(虽然看起来像空格),xy根本没有被读取(即它们保留了它们初始化时的值)。

要解决这个问题,请尝试在两个scanf中都添加换行符。也就是:

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

并且之后
scanf("%c %d %d\n", &opb, &x, &y);

谢谢,我尝试了这个方法,但现在它在第一个scanf()处卡住了。例如输入:“g 10 10<return>”,它会一直等到我按下ctrl+d,然后才继续执行。 - Milk
是的,我相信这是由于键盘输入缓冲区的方式。如果您将第一个scanf更改回scanf(“%c%d%d”,&op,&width,&height);并将第二个scanf更改为scanf(“\ n%c%d%d”,&opb,&x,&y);它就不会挂起了。关键是适当处理空格字符。 - srgerg
1
是的,那就是问题所在,但我通过在后续扫描中使用空格并消除 \n 来解决了它。例如: scanf("%c %d %d", &op, &width, &height);然后scanf(" %c %d %d", &opb, &x, &y);感谢大家的帮助。 - Milk

1

我认为最简单的方法是在第二个scanf中在%c之前加上空格。如果不带空格使用它,它将获取第一个符号。也就是说,换行符。空格使%c获取第一个不是空格或制表符的符号。所以:

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

我不相信“%c”会忽略空格。 - Ace.C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接