Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不是';t scanf()正在等待键盘输入?_C_Printf_Structure_Scanf_Fflush - Fatal编程技术网

为什么不是';t scanf()正在等待键盘输入?

为什么不是';t scanf()正在等待键盘输入?,c,printf,structure,scanf,fflush,C,Printf,Structure,Scanf,Fflush,我有下面的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

我有下面的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;
}
可以看到,当i=2时,scanf()不会等待键盘。然后,当i=3时,scanf()等待键盘输入。同样在i=4中,scanf()不等待键盘输入

我想我用过

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

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

请任何人指出,我的程序哪里出了问题


谢谢。

C11标准解释了
%c
的工作原理:

§7.21.6.2/8输入空白字符(由
isspace
功能指定) 跳过,除非规范包括
[
c
n
说明符

因此,由enter键生成的换行符被%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如果
指向输出流或更新流,其中 未输入最近的操作,
fflush
函数导致 要传递到主机的该流的任何未写入数据 要写入文件的环境;否则,行为为 未定义。


C11标准解释了
%c
的工作原理:

§7.21.6.2/8输入空白字符(由
isspace
功能指定) 跳过,除非规范包括
[
c
n
说明符

因此,由enter键生成的换行符被%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如果
指向输出流或更新流,其中 未输入最近的操作,
fflush
函数导致 要传递到主机的该流的任何未写入数据 要写入文件的环境;否则,行为为 未定义。


1.不要使用
fflush(stdin);
它是用于stdout 2.
scanf(“%c%f%d”,&b[i].name,&b[i].price,&b[i].pages);
空格和空格fixed@Rizier123:您的意思是
%c%f%d”
?因为数字之间有空格。@TimČ因为数字之间的空格与格式说明符无关,所以末尾左边的空格很重要。
printf
语句在这里很方便。基本调试。@user3121023:啊,对。不过出于代码风格的原因,还是个好主意。1.不要使用
fflush(stdin);
用于stdout 2.
scanf(“%c%f%d”,&b[i].name,&b[i].price,&b[i].pages);
空格和空格fixed@Rizier123:您的意思是
%c%f%d”
?因为数字之间有空格。@TimČ因为数字之间的空格与格式说明符无关,所以末尾左边的空格很重要。
printf
语句会在这里派上用场。基本调试。@user3121023:啊,对。不过出于代码风格的原因,这仍然是个好主意。当我在%c之前加了一个“”。但是我仍然无法理解为什么fflush(stdin)没有解决这个问题。我想我应该读一下exaclt fflush()的作用。@user266168答案未定义。它可以做任何事情。不要依赖它。当我在%c之前加一个“”时,我得到了预期的结果。但是我仍然无法理解为什么fflush(stdin)没有解决这个问题。我想我应该在某个地方阅读exaclt fflush()的功能。@user266168答案没有定义。它可以做任何事情。不要依赖它。
fflush(stdin);