0

我有以下C代码。

#include<stdio.h>

int main()
{
    //Declaring structure book.
    struct book
    {
            char name;
            float price;
            int pages;
    };

    struct book b[5];

    int i;
    //Below loop takes the info if 5 books from user
    for (i=0; i<5; i++)
    {
            printf("Enter name, price, and pages: ");
            fflush( stdin );
            scanf("%c%f%d",&b[i].name,&b[i].price,&b[i].pages);
    }
        return 0;
}

但是,当我编译并运行时,会发生一些奇怪的事情。

-bash-4.1$ ./a.out
Enter name, price, and pages: A 23 34
Enter name, price, and pages: B 34 54
Enter name, price, and pages: Enter name, price, and pages: C 56 78
Enter name, price, and pages: -bash-4.1$

您可以看到,当 i = 2 时,scanf() 不会等待键盘。然后当 i = 3 时,scanf() 等待键盘输入。同样在 i=4 中,scanf() 不等待键盘输入。

我想我用过

fflush(stdin);

在正确的地方。我不希望返回键在下一个 scanf() 的缓冲区中。

为了调试,我尝试不使用 fflush(stdin) 并查看发生了什么。但即使没有 fflush(stdin),当我运行程序时也会发生同样的事情。所以我猜 fflush(stdin) 不会导致这个问题。

请任何人指出,我的程序哪里出错了?

谢谢。

4

1 回答 1

4

C11 标准解释了如何%c工作:

§7.21.6.2/8 输入的空白​​字符(由isspace函数指定)被跳过,除非规范包括一个[、、cn 说明符。

因此,回车键产生的换行被 %c 消耗掉了。您可以通过在之前添加一个空格来解决此问题%c

§7.21.6.2/5 由空白字符组成的指令通过读取输入直到第一个非空白字符(仍然未读取)或直到无法读取更多字符来执行。该指令永远不会失败。

您的代码变为scanf(" %c%f%d",&b[i].name,&b[i].price,&b[i].pages);.


注意这里fflush应该使用。

§7.21.5.2/2 如果stream指向未输入最近操作的输出流或更新流,则该fflush函数会导致该流的任何未写入数据被传递到主机环境以写入文件;否则,行为未定义。

于 2015-02-12T00:37:05.273 回答