【问题标题】:how to empty stardard input/output buffer in C [duplicate]如何在C中清空标准输入/输出缓冲区[重复]
【发布时间】:2013-07-01 12:48:25
【问题描述】:

首先我调用 getchar() 并在标准输入/输出上输入一些字符,因为 scanf() 也可以获取这些字符,我想在调用 scanf() 之前清空缓冲区,这是程序。

int main()
  {
    getchar();   // i input some characters here , "abcdefgh" 


    ------ // here i need some statement that will empty standard input/output.

    int a;
    scanf("%d",&a);  // so if buffer is empty, this prompt me to enter chacter.
                                    // if i enter 7 
    printf("%d",a);                // this should print 7

    }

【问题讨论】:

  • 您可以在stdin 上使用fflush,但您应该知道它是非标准的,并且可能不适用于所有系统。
  • printf("%d\n", a); //这应该打印 7...
  • 请详细说明您的目标。在我看来getchar() 是通过等待输入来执行的。您开始输入“abc ...”。但是在你输入 'a' 之后,getchar() 完成并且你想要的“空标准输入/输出”将在你有时间输入“bc ...”之前执行。因此在scanf() 执行之前不会刷新“bc ...”。你的想法?

标签: c io scanf getchar


【解决方案1】:

使用fflush(stdin)。来自manpagefflush()

对于输入流,fflush() 会丢弃任何已缓冲的数据 从底层文件中获取,但尚未被 应用。流的打开状态不受影响。

但是请注意,这不是标准的。
你也可以this:

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

这将丢弃所有多余的字符,直到换行。
对于输出缓冲区,请使用:fflush(stdout);

【讨论】:

  • 仅供参考的读者:要非常注意“这不是标准”。 这是技术上未定义的行为;不要在可移植代码中使用它。
【解决方案2】:

刷新输入流是未定义的行为。 对于输出缓冲区,试试这个:

fflush(stdout);

setbuf(stdout,NULL);

您也可以尝试fpurge 函数fpurge() 擦除在给定流中缓冲的任何输入或输出。对于输出流,这会丢弃任何未写入的输出。 对于输入流,这会丢弃从底层对象读取的任何输入。 注意:fpurge 是非标准且不可移植的。

看看stackoverflow上的这个帖子:I am not able to flush stdin

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 2011-12-15
    相关资源
    最近更新 更多