首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 輸入 0.99 進入死循環?cin 類型不匹配導致流錯誤狀態

     編輯:程式設計疑難解答

問題代碼

int userMonth;
cin >> userMonth; // 輸入 0.99
while (userMonth > 12 || userMonth < 1) {
    cin >> userMonth; // 死循環
}

發生過程

  1. cin >> userMonth 讀取整數,從輸入流中解析出 0(0.99 的整數部分),賦值給 userMonth。
  2. 流中殘留 .99,下一次 cin >> userMonth 嘗試讀取整數,遇到 . 非數字字符,讀取失敗,userMonth 值不變(仍為 0),流進入錯誤狀態(failbit)。
  3. 後續所有 cin 操作均無效,循環條件永真,陷入死循環。

調試技巧

在循環內打印 cin.good()、cin.fail()、userMonth 即可觀察到流狀態變化。

修正方案

  • 輸入驗證:讀取為 double 或 string,再轉換檢查。
  • 流錯誤恢復:檢測失敗後調用 cin.clear() 清除錯誤標誌,並 cin.ignore(numeric_limits::max(), '\n') 跳過殘留輸入。
  • 循環條件增強:while (!(cin >> userMonth) || userMonth < 1 || userMonth > 12) 結合輸入操作本身判斷。

核心教訓:cin 讀取失敗不會拋出異常,只會設置錯誤標誌並停止提取,必須顯式檢查並恢復。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved