我們先來談談cin.clear的作用,第一次看到這東西,很多人以爲就是清空cin裏面的數據流,而實際上卻與此相差很遠,首先我們看看以下代碼: #include <iostream> using namespace std; int main() { int a; cin>>a; cout<<cin.rdstate()<<endl; if(cin.rdstate() == ios::goodbit) { cout<<"輸入數據的類型正確,無錯誤!"<<endl; } if(cin.rdstate() == ios_base::failbit) { cout<<"輸入數據類型錯誤,非致命錯誤,可清除輸入緩衝區挽回!"<<endl; } system("pause"); } 我們定義要輸入到的變量是整型,但如果我們輸入了英文字母或者漢字,那就會發生錯誤,cin裏有個方法能檢測這個錯誤,就是cin.rdstate(); 當cin.rdstate()返回0(即ios::goodbit)時表示無錯誤,可以繼續輸入或者操作,若返回4則發生非致命錯誤即ios::failbit,則不能繼續輸入或操作.而cin.clear則可以控制我們此時cin裏對這個問題的一個標識.語發如下: cin.clear(標識符); 標識符號爲: goodbit 無錯誤 Eofbit 已到達文件尾 failbit 非致命的輸入/輸出錯誤,可挽回 badbit 致命的輸入/輸出錯誤,無法挽回 若在輸入輸出類裏.需要加ios::標識符號 通過cin.clear,我們能確認它的內部標識符,如果輸入錯誤則能重新輸入.結合真正的清空數據流方法cin.sync(),請看下例: #include <iostream> using namespace std; int main() { int a; while(1) { cin>>a; if(!cin) //條件可改寫爲cin.fail() { cout<<"輸入有錯!請重新輸入"<<endl; cin.clear(); cin.sync(); //清空流 } else { cout<<a; break; } } system("pause"); } 上面的cin默認參數爲0,即無錯誤,正常操作.當我們輸入英文字母'k'時,它的狀態標識改爲fail(即1),即錯誤,用cout對用戶輸出信息,再用cin.clear讓錯誤標識改回爲0,讓我們可以繼續輸入,再清空流數據繼續輸入.如果我們沒有了cin.clear,則會進入死循環,其過程爲我們輸入了英文字母,它的狀態標識便爲fail,當運行到條件判斷時,便總是回到錯誤的條件表示裏,並且我們再也沒辦法輸入,因爲錯誤的表示關閉了cin,所以會進入死循環. --------------------------------------------------------------------- 自己再添加一句:如果輸入錯誤,則再也輸入不進去,須用clear.而sync用於清除當前輸入緩衝區中的內容。 #include <iostream> int main() { using namespace std; int a; cin >> a; cout << a <<endl; cin >> a ; cout <<a <<endl; cin.clear(); cin.sync(); // 可以將cin.clear();cin.sync(); 不同時註釋掉試一下就知道了 cin >> a; cout <<a <<endl; return 0; } cin.sync(); // 這個函數是用來清空緩衝區的 cin.clear();的錯誤是清楚錯誤標誌 例如一下程序 #include <iostream> using namespace std; int main() { int a,b; cin>>a; cin>>b; return 0; } 假如,運行都cin>>a時要求輸入,這是輸入的是一個字符。 這樣,和a的類型不符合,cin的狀態就標誌爲錯誤,因爲cin的狀態爲錯誤,以後的cin>>都不會被執行。 可能你有疑問,“是不是在cin>>b前加個cin.clear(),cin>>b就可以執行”。 答案是不是的,因爲在第一次輸入字符時候cin>>a;因爲類型不符合,就不會從輸入流中提取數據,也就是說,輸入流中,上一次輸入的字符仍然存在。 那麼我們可以使用cin.sync()來清空輸入流。 cin>>a; cin.clear(); cin.sync(); cin>>b; 總之,cin.clear()一般要和cin.sync()一起用
cin.clear()與cin.sync()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
CMake::CMakeLists.txt基本語法及常用
dieju8330
2020-07-08 10:35:13
while(cin)的理解
xudacheng06
2020-07-08 09:57:59
Operator new函數
xudacheng06
2020-07-08 09:57:59
C++中指針和引用的區別(轉)
沉沦风帆
2020-07-08 09:57:11
const和static const還有static區別
對於C/C++語言來講, const就是隻讀的意思,只在聲明中使用; static一般有2個作用,規定作用域和存儲方式.對於局部變量,static規
沉沦风帆
2020-07-08 09:57:11
使用std::function和std::bind實現函數回調
Ango_
2020-07-08 09:39:18
函數取地址與複製構造函數的使用
wenrenhua08
2020-07-08 09:06:32
C++ 中的explicit構造函數
C++ explicit構造函數 explicit按字面意思是明確的,顯式的。在C++類中只要定義的構造函數編譯器就不會幫你生成默認構造函數。
wenrenhua08
2020-07-08 09:06:32
C++ 中的const關鍵字
爲什麼使用const?採用符號常量寫出的代碼更容易維護;指針常常是邊讀邊移動,而不是邊寫邊移動;許多函數參數是隻讀不寫的。c
wenrenhua08
2020-07-08 09:06:21
鏈表的建立插入與刪除
陆家三少
2020-07-08 08:35:09
C++面試題之螺旋隊列
//螺旋隊列.cpp// 21 22 ... ...// 20 7 8 9 10// 19 6 1 2 11// 18 5 4 3 12// 17 16 15 14 13//看
陆家三少
2020-07-08 08:35:09
最大公約數的遞歸解法
陆家三少
2020-07-08 08:35:09