int a;
while (cout<<"input (1-10): ", cin>>a, !(a>=1 && a<=10))
cout<<"try again!"<<endl;
輸入非整數(如字元)後,程式進入無限迴圈狂印 try again!。
cin >> a 讀取失敗,設定 failbit,cin 進入錯誤狀態。>> 操作立即失效,不再從緩衝區取資料。cin 永不恢復,形成死循環。while (cout<<"input (1-10): ", cin>>a, !(a>=1 && a<=10) || cin.fail())
{
cout<<"try again!"<<endl;
cin.clear(); // 清除錯誤旗標
cin.sync(); // 清空輸入緩衝區(關鍵!)
}
cin.clear():重置 failbit/badbit,恢復正常狀態。cin.sync():丟棄緩衝區內殘留的無效字元,否則下一輪讀取仍會失敗。|| cin.fail() 確保錯誤輸入也進入處理分支。標準輸入 → 鍵盤緩衝區 → istream 擷取。sync() 相當於清空中介緩衝區,斷開錯誤資料的傳遞鏈。
clear() + sync()(或 ignore(numeric_limits<streamsize>::max(), '\n'))。getline 讀整行再 stringstream 解析,完全避開 >> 的格式化陷阱。