C++中使用cin輸入時的出錯處理

一、cin.clear()、cin.sync()

cin.clear()是用來更改cin的狀態標示符的。
cin.sync()是用來清除緩存區的數據流的。

如果標示符沒有改變那麼即使清除了數據流也無法輸入,反之同理。所以兩個要聯合起來使用。例如:

#include<iostream>
using namespace std;
int main()
{
 int a;
 cout<<"輸入一個字母:"<<endl;
 cin>>a;  //int型變量中放了char型數據,failbit置1
 cout<<"cin.fail()="<<cin.fail()<<endl;    //輸出1
 //cin.clear();
 //cin.sync();
 cout<<"輸入一個數字:"<<endl;    //由於failbit值爲1,輸入流不能正常工作
 cin>>a;                         //故此處的輸入無效
 cout<<a<<endl;                  //輸出不確定值
 cin.clear();                    //此處用cin.clear()流標誌復位
 //cin.sync();
 cout<<"cin.fail()="<<cin.fail()<<endl;        //此處failbit已爲0
 cout<<"輸入一個數字:"<<endl;
 //但剛纔輸入的字符並沒有從流中清除,所以cin>>a又把那個字符放入a中,流輸入流又不能正常工作
 cin>>a;
 cout<<a<<endl; //輸出不確定值
 cout<<"cin.fail()="<<cin.fail()<<endl;    //在此處failbit又爲1
 cin.clear();            //再次修復輸入流
 cin.ignore();            //取走剛纔流中的字符
 cout<<"輸入一個數字:"<<endl;    //再次接收用記輸入,這次輸入數字,正常輸出了
 cin>>a;
 cout<<"a="<<a<<endl;
 //現在再看一下輸入流的failbit
 cout<<"cin.fail()="<<cin.fail()<<endl;//輸出0,表明輸入流已恢復正常
 return 0;
}

二、cin.ignore(a,ch)

從輸入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。
每拋棄一個字符,它都要計數和比較字符:如果計數值達到a或者被拋棄的字符是ch,則cin.ignore()函數執行終止;否則,它繼續等待。

它的一個常用功能就是用來清除以回車結束的輸入緩衝區的內容,消除上一次輸入對下一次輸入的影響。
比如可以這麼用:
cin.ignore(1024,’\n’),通常把第一個參數設置得足夠大,這樣實際上總是隻有第二個參數’\n’起作用,所以這一句就是把回車(包括回車)之前的所以字符從輸入緩衝(流)中清除出去。

三、cin.sync()和cin.ignor()的比較

sync()的作用就是清除輸入緩衝區。成功時返回0,失敗時badbit會置位,函數返回-1。
另外,對於綁定了輸出的輸入流,調用sync(),還會刷新輸出緩衝區。

但由於程序運行時並不總是知道外部輸入的進度,很難控制是不是全部清除輸入緩衝區的內容。通常我們有可能只是希望放棄輸入緩衝區中的一部分,而不是全部。比如清除掉當前行、或者清除掉行尾的換行符等等。但要是緩衝區中已經有了下一行的內容,這部分可能是我們想保留的。這個時候最好不要用sync()。可以考慮用ignore函數代替。

cin.ignore(numeric_limits<std::streamsize>::max(),'/n');//清除當前行
cin.ignore(numeric_limits<std::streamsize>::max());     //清除cin裏所有內容

不要被長長的名字嚇倒,numeric_limits::max()不過是climits頭文件定義的流使用的最大值,你也可以用一個足夠大的整數代替它。
使用ignore顯然能比sync()更精確控制緩衝區。(1)

(1)參考於:http://blog.csdn.net/lann64/article/details/3544479

發佈了26 篇原創文章 · 獲贊 31 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章