2014-02-14 158 views
4

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

我试图写一个小的输入功能,是不是容易受到缓冲区溢出。为此,我使用了fgets(entered_text,30,stdin);按照承诺运作。

然而,在溢出的情况下,我留在,当我下一次调用输入功能,都读取输入缓冲区的东西。我想清空缓冲区以避免这种情况。

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

有没有办法为我检查,如果输入缓冲器是空的,或通过其他方式空吗?

在此先感谢。

+0

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

+0

这将做的工作:http://stackoverflow.com/a/21709726/694576 – alk

回答

2

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

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

+0

'select'是POSIX或BSD,不C,并使用文件描述符,而不是'FILE *'。 –

+0

@JensGustedt:使用fileno(FILE *)将FILE *转换为文件描述符。 select()可能不是C的一部分,但谁在乎?它在每个相关的平台上。 –

0

可以使用fpurge功能来清除缓冲区流。请阅读fpurge的手册页以获取更多信息。

+2

'fpurge()'是非标准的。 – alk