【问题标题】:fflush(stdin) not working on Xcode on Mac [duplicate]fflush(stdin)在Mac上的Xcode上不起作用[重复]
【发布时间】:2018-06-15 16:35:34
【问题描述】:

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

【问题讨论】:

  • fflush(stdin) 是未定义的行为。在这里读了很多遍,所以它一定是真的:)
  • @Jean-FrançoisFabre fflush(stdin) 根据 C 标准的未定义行为。但是,POSIX 和 Windows 都定义了该行为。不幸的是,在这两个规范中,定义的行为是绝对没用的。

标签: c xcode macos


【解决方案1】:

来自standard 7.21.5.2

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

您的代码中有未定义的行为。更清楚地说,fflush 不起作用。最常见的方法如下所示:

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

另一种解决方案是使用(对您来说更容易,但不可靠)

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

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

旁注

另外一种完全摆脱这个问题的方法是使用fgets 或类似方法来读取一行,然后使用strtolstrtod 从输入的行中解析出所需的输入。 scanf 对于格式化输入非常有用。您将遇到的情况 - 最好使用fgetsscanf 的情况太多,您必须以其他方式处理。

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

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 2015-06-26
    • 2012-02-25
    • 2012-12-27
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    相关资源
    最近更新 更多