这是我尝试在Mac上运行的代码。在此fflush
之后的陈述不起作用。在fflush
之后,编译器应该停止并等待用户输入,但它不会。
任何人都可以告诉我为什么会这样或者还有其他办法吗?
int main()
{
int pos,neg,zero,num;
char ans = 'y';
pos=neg=zero=0;
while(ans == 'y' || ans=='Y')
{
printf("\nEnter a number : ");
scanf("%d",&num);
if(num==0)
zero++;
if(num>0)
pos++;
if(num<0)
neg++;
fflush(stdin);
printf("\nDo you want to continue?\n\n");
scanf("%c",&ans);
}
printf("You entered %d positive numbers\n",pos);
printf("You entered %d negative numbers\n",neg);
printf("You entered %d zeros \n",zero);
return 0;
}
答案 0 :(得分:2)
如果流指向输出流或未输入最近操作的更新流,则fflush功能会导致 要传递给主机的该流的任何未写入数据 要写入文件的环境; 否则,行为是 未定义。强>
您的代码中存在未定义的行为。更清楚的是,fflush
无法奏效。最常见的方法是如下所示:
int c;
while ((c = getchar()) != '\n' && c != EOF){}
另一个解决方案是使用(对你来说更容易,但不健壮)
scanf(" %c",&ans);
^^
这将确保消耗所有空白区域。这将解决可能出现的问题之一,但不是全部。 (其他因使用scanf
和错误输入而出现。)
旁注
完全摆脱这个问题的另一种方法是使用fgets
或类似的方法来读取一行,然后使用strtol
或strtod
来获取从中解析的所需输入输入线。 scanf
对格式化输入非常有用。您将拥有的方案 - 最好使用fgets
,有scanf
的案例太多,否则您必须处理。
对于错误的输入,您需要刷新标准输入,这样您就不必在下一个scanf
中再次处理它们。如果您使用fgets
,那么您将从stdin获取输入行,然后如果您可以解析它并且输入正确 - 您继续处理它,否则您丢弃整行并等待下一个{{ 1}}来电。