【问题标题】:How do I flush the input buffer? (C) [duplicate]如何刷新输入缓冲区? (C) [重复]
【发布时间】:2014-03-13 14:54:06
【问题描述】:

正是它在锡上写的。有没有办法让我在不使用未定义的 fflush(stdin) 或循环的 getchar() 的情况下清空输入缓冲区以准备进一步的用户输入?

我正在尝试编写一个不易受缓冲区溢出影响的小型输入函数。为此,我使用了 fgets(entered_text, 30, stdin);按承诺工作。

但是,如果发生溢出,我会在输入缓冲区中剩余一些内容,这些内容会在我下次调用输入函数时被读取。我想清空缓冲区以避免这种情况。

fflush(stdin) 受支持,但未定义。 http://c-faq.com/stdio/stdinflush2.html 建议我使用 getchars 循环,但问题是如果输入缓冲区为空,它将请求一个字符并强制我按两个 'enter'。

有没有办法让我检查输入缓冲区是否为空,或者通过其他方式清空它?

提前致谢。

【问题讨论】:

  • 如果fgets 无法存储所有数据,那么最后一个字符将不是'\n',这意味着您可以继续读取更多数据。我一直不明白为什么人们认为在这种情况下他们需要“刷新输入缓冲区”。很容易看出是否有更多的数据。继续阅读字符,直到出现“\n”或 EOF。这是仅有的两种可能性(否则它是一个正常的字符)。

标签: c flush


【解决方案1】:

您可以使用select()检查输入是否为空。

一些相关信息在这里:C select() timeout STDIN single char (no ENTER)

【讨论】:

  • select 是 POSIX 或 BSD,而不是 C,并且使用文件描述符而不是 FILE*
  • @JensGustedt:使用 fileno(FILE*) 将 FILE* 转换为文件描述符。 select() 可能不是 C 的一部分,但谁在乎呢?它在每个相关平台上。
【解决方案2】:

您可以使用 fpurge 函数来清除缓冲流。请阅读 fpurge 的手册页了解更多信息。

【讨论】:

  • fpurge() 是非标准的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多