2014-02-14 160 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