fflush(stdin)没有在Mac上使用Xcode

时间:2018-01-05 20:27:23

标签: c xcode macos

这是我尝试在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;
}

1 个答案:

答案 0 :(得分:2)

来自standard 7.21.5.2

  

如果流指向输出流或未输入最近操作的更新流,则fflush功能会导致   要传递给主机的该流的任何未写入数据   要写入文件的环境; 否则,行为是   未定义。

您的代码中存在未定义的行为。更清楚的是,fflush无法奏效。最常见的方法是如下所示:

int c;
while ((c = getchar()) != '\n' && c != EOF){}

另一个解决方案是使用(对你来说更容易,但不健壮)

scanf(" %c",&ans);
       ^^

这将确保消耗所有空白区域。这将解决可能出现的问题之一,但不是全部。 (其他因使用scanf和错误输入而出现。)

旁注

完全摆脱这个问题的另一种方法是使用fgets或类似的方法来读取一行,然后使用strtolstrtod来获取从中解析的所需输入输入线。 scanf对格式化输入非常有用。您将拥有的方案 - 最好使用fgets,有scanf的案例太多,否则您必须处理。

对于错误的输入,您需要刷新标准输入,这样您就不必在下一个scanf中再次处理它们。如果您使用fgets,那么您将从stdin获取输入行,然后如果您可以解析它并且输入正确 - 您继续处理它,否则您丢弃整行并等待下一个{{ 1}}来电。