清理cin輸入緩衝區 在C 中清除輸入緩衝區

2021-10-12 15:49:35 字數 1460 閱讀 9979

問題引入

用過c++的都明白,在運用輸入過程中會出現不經意間意外輸入錯誤的情況,導致之後的輸入無效,c++內部會繼續使用之前的意外輸入,使得程式執行錯誤。

輸入緩衝區

所有從鍵盤輸入的資料,不管是字元還是數字,都是先儲存在記憶體中的乙個緩衝區裡面,叫做鍵盤緩衝區,簡稱輸入緩衝區或者輸入流。

當一次鍵盤輸入結束時會將輸入的資料存入輸入緩衝區,而cin函式直接從輸入緩衝區中讀取資料。這種緩衝機制規定,只有收到回車鍵時,才會將所有輸入的資料一次性提交到cin函式。回車標誌一次輸入的完成,如果資料不夠,則會等待使用者繼續輸入;如果資料有多餘,則將多餘的資料儲存在輸入流緩衝區中,供下次使用。

如何解決

1.cin.clear()

這是各個狀態識別符號的含義:

(有道翻譯)

goodbit 無錯誤,cin.rdstate()為0

eofbit 已到達輸入操作的檔案尾 ,cin.rdstate()為1

failbit i/o操作的邏輯錯誤(非致命的輸入/輸出錯誤,可挽回),cin.rdstate()為2

badbit i/o操作的讀/寫錯誤(致命的輸入/輸出錯誤,無法挽回),cin.rdstate()為4

比如:定義要輸入到的變數是整型,但如果我們輸入了其它字元,那就會發生錯誤。cin裡有個方法能檢測這個錯誤,就是cin.rdstate(); 當cin.rdstate()返回0(即ios::goodbit)時表示無錯誤,可以繼續輸入或者操作,若返回2則發生非致命錯誤(即ios::failbit)則不能繼續輸入或操作。

#include

using namespace std;

int main()

while (true)

int a;

cin >> a;

cout << "a=>"<

cout << "cin.goodbit=>" << cin.goodbit << endl;

cout << "cin.eofbit=>" << cin.eofbit << endl;

cout << "cin.failbit=>" << cin.failbit<< endl;

cout << "cin.badbit=>" << cin.badbit << endl;

cout << "cin.rdstate()=>" << cin.rdstate() << endl;

system("pause");

return 0;

// 依次輸入:1,2,#(之後無法繼續輸入)

加幾行**,呼叫cin.clear(),輸入「#」依舊無法繼續輸入,但是可以把狀態為都清掉(cin.rdstate()返回goodbit,即0),看結果:

#include

using namespace std;

int main()

while (true)

int a;

cin >> a;

cout << "a=>"<

C語言清除輸入緩衝區

在使用scanf輸入時,如果輸入不合法,此時可以檢查其返回值為0,但下次再呼叫時,上次不合法的輸入,還在輸入緩衝區中,此時就會接著不合法,如下 include int main int argc,char argv printf you input is d n id return 0 這樣,如果輸...

C語言清除輸入緩衝區

在使用scanf輸入時,如果輸入不合法,此時可以檢查其返回值為0,但下次再呼叫時,上次不合法的輸入,還在輸入緩衝區中,此時就會接著不合法,如下 include int main int argc,char argv printf you input is d n id return 0 這樣,如果輸...

c清除緩衝區資料

如何清空輸入緩衝區的內容 c標準規定 fflush stdout 緩 存的。對 於輸入 stdin 它是沒有定義的。但是有些編譯器也定義了 fflush stdin 的實現,比如微軟的 vc。其它編譯器是否也定義了 fflush stdin 的實現應當查詢它的手冊。gcc編譯器沒有定義它的實現,所以...