伊谢尔伦2017-04-17 14:59:46
在std::basic_ios
中定義了operator bool
:
explicit operator bool() const; //C++11
所以如果對標準IO流進行形如if (!cin)
的bool
判斷時,便會調用operator bool
,其返回的結果將會作為if的判斷條件。
於是當cin
輸入流出現錯誤時,if (!cin)
中的條件會被判斷為真,此時可以呼叫cin.clear()
來重置流的狀態,同時呼叫cin.ignore()
來清除輸入緩衝區中的內容,來消除上次輸入對下次輸入的影響,常見做法為:
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
通常這樣把第一個參數設定得足夠大,使得實際只有第二個參數'n'起作用,這樣便可以把回車前的輸入字元從輸入緩衝流中擦除。然後便嘗試進行讀取下次的輸入。
if (!cin)
{
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
continue;
}