【问题标题】:Replacement of fflush(stdin)替换 fflush(stdin)
【发布时间】:2011-06-08 10:29:57
【问题描述】:

我有以下代码,

fflush(stdin);
print("Enter y/n");
scanf("%c",&a);

在这里,它在给出输入之前就退出了。看起来问题是因为它没有刷新可能有一些垃圾字符的输入缓冲区。flush(stdin)有什么替代方法。这个代码sn- p 在 Solaris 中运行,但在 Linux 中不运行。

【问题讨论】:

  • man fflush 的第一行内容如下:函数fflush() 强制写入给定输出或更新的所有用户空间缓冲数据。 cnicutar 对于如何跳过不需要的输入有正确的答案,但除此之外,您应该阅读您正在使用的函数的文档。 并且检查它们的返回值...因为您上面的调用将返回EOF 并设置errno = EBADF 以表明您对该函数的错误使用。忽略返回值是不好的,不好的,不好的......

标签: c


【解决方案1】:

这在C FAQ 中有很好的解释。另请参阅:explanation。建议的解决方案:

  • 使用 scanf 退出。使用fgetssscanf
  • 用这个来吃换行符

    while((c = getchar()) != '\n' && c != EOF)
    /* discard the character */;
    

刷新标准输入的事实适用于某些实现is wrong

一些供应商确实实施了 fflush 所以 fflush(stdin) 丢弃未读 字符,虽然可移植程序 不能依赖这个。

【讨论】:

    【解决方案2】:

    对于 GNU 上的 C

    你可以使用

    
    
    
    __fpurge(stdin);
    

    包含用于访问函数的 stdio_ext.h 头文件。尽管这篇文章已经很老了,但我认为这可能会对一些 linux 开发人员有所帮助。

    【讨论】:

    • 这太可怕了,即使它按预期工作。想象一下如果输入来自文件或管道会发生什么。
    【解决方案3】:
    scanf(" %c",&c);
    

    scanf(" ");
    //reading operation (gets(), fgets(stdin,...) etc)
    

    scanf() 格式字符串中的空格将忽略任何空格,直到第一个非空格。

    【讨论】:

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