我們談談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.clear()默認參數爲0,即無錯誤,正常操作.當我們輸入英文字母’k’時,它的狀態標識改爲fail,即錯誤,用cout對用戶輸出信息,再用cin.clear讓錯誤標識改回爲0,讓我們可以繼續輸入,再清空流數據繼續輸入.如果我們沒有了cin.clear,則會進入死循環,其過程爲我們輸入了英文字母,它的狀態標識便爲fail,當運行到條件判斷時,便總是回到錯誤的條件表示裏,並且我們再也沒辦法輸入,因爲錯誤的表示關閉了cin,所以會進入死循環.
轉載自 : 博客園
原文鏈接 :https://www.cnblogs.com/tonglingliangyong/p/3908463.html