問題引入
用過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編譯器沒有定義它的實現,所以...