为什么不是';t scanf()正在等待键盘输入?
我有下面的C代码为什么不是';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
#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);