2011-04-27 27 views
2

fflush(stdin)在C++中是否真的需要,用這種方法刷新緩衝區中的換行符是否很好?fflush(stdin)的替代方案?

+1

您不應該爲輸入流調用fflush。你也不應該混合使用C和C++ I/O。 – 2011-04-27 20:53:31

回答

7

呼叫到fflush(stdin)是在C(和,consequetly,在C++)未定義的行爲。

C語言標準,ISO 9899:在7.19.5.2/2

1999年美國如果流點到輸出流或其中最近 操作不是輸入的更新流, fflush函數會將該流 的所有未寫入數據傳遞到主機環境以寫入文件;否則,該行爲是 未定義

要放棄整個輸入到行的下一個端部,在C++中,最可靠的方法是

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

至於節目「閃爍,要離開「,你是否可能在Windows平臺上執行控制檯應用程序?這樣的應用程序最好在控制檯窗口中執行(開始 - >運行 - > cmd.exe)

+0

這個工作,但很尷尬,我不明白**的std :: numeric_limits <性病:: streamsize可> :: MAX()** – mukesh 2011-04-27 21:11:06

+0

是什麼** MAX()**,什麼是** ** numeric_limits是什麼**碼流大小** – mukesh 2011-04-27 21:13:39

+0

我想如果它是最健壯的,那麼我應該使用它,但?? – mukesh 2011-04-27 21:15:20

0

代碼末尾的getchar()獲取stdin(輸入緩衝區)中的下一個字符。如果那裏沒有角色,那麼它將等待直到用戶輸入一些東西。 fflush(stdin)清除輸入緩衝區。

這就是爲什麼你的代碼將等待,如果你有fflush,因爲你清除輸入緩衝器,造成的getchar等待用戶的下一個輸入。不過,它看起來像是在緩衝區中留下了一些東西,導致getchar'get'它,這會結束您的程序。

如果你想程序保持開放大功告成之後,然後離開那裏平齊。如果您想立即關閉,請移除沖水。

4

使用cin.get(),而不是getchar(),你應該罰款。問題是C++ I/O流和C I/O函數在相同的文件描述符之上工作,但具有不同的緩衝區。我無法確定在沒有調試的情況下到底發生了什麼,但感覺就像您要調用暫停程序的getchar(),直到輸入字符才能獲取已由C++輸入流讀取的字符。所以它獲取數據並取消阻止,所以你退出程序。

如果你還有問題,請確保您不輸入'\ n」字符(即不按Enter鍵)。因爲在輸入後按Enter鍵實際上是一個可以閱讀的字符。這個問題通常通過偷看來解決(參見http://www.cplusplus.com/reference/iostream/istream/peek/)。