如何清空输入缓冲区?(C语言)

4

这句话的意思是:如何在不使用未定义的fflush(stdin)或循环getchar()的情况下清空输入缓冲区以准备接收更多用户输入?

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

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

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

是否有一种方法可以检查输入缓冲区是否为空,或通过其他方式清空它?

提前致谢。


如果fgets不能存储所有数据,那么最后一个字符将不是'\n',这意味着您可以继续读取更多数据。我从来没有理解为什么人们认为他们需要在这种情况下“刷新输入缓冲区”。如果还有更多数据,很容易看到。保持读取字符,直到出现'\n'或EOF。这些是唯一的两种可能性(否则它是正常字符)。 - Brandin
这个可以完成任务:http://stackoverflow.com/a/21709726/694576 - alk
2个回答

2

select 是 POSIX 或 BSD 标准,而不是 C 标准,并且使用文件描述符而不是 FILE* - Jens Gustedt
@JensGustedt:使用fileno(FILE*)将FILE*转换为文件描述符。select()可能不是C的一部分,但谁在乎呢?它在每个相关平台上都有。 - John Zwinck

0

您可以使用fpurge函数来清除缓冲流。请阅读fpurge的man页面以获取更多信息。


2
fpurge() 是非标准的。 - alk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接