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

C++ getline 讀取空行問題:cin >> 後殘留換行符導致首次 getline 讀空

     編輯:程式設計疑難解答

問題現象

int num; cin >> num;        // 輸入 3 並按 Enter
string line;
getline(cin, line);         // 若無此行,下一行 getline 讀到空字串
for (int i=1; i<=num; i++) {
    getline(cin, line);
    numlist.push_back(line);
}

根本原因

operator>> 讀取整數時,停留在換行符 '\n' 之前(不會消耗換行符)。緊接著的 getline 讀取至換行符,發現緩衝區第一個字元就是 '\n',因此回傳空字串並消耗該換行符。

解決方案

  1. 呼叫一次空的 getline 吃掉殘留換行符(最常用):
    cin >> num;
    getline(cin, line); // 吃掉 '\n'
    
  2. 使用 cin.ignore():
    cin >> num;
    cin.ignore(numeric_limits::max(), '\n'); // 忽略至換行符
    
    需 #include 。
  3. 統一使用 getline + 字串轉換:
    string tmp; getline(cin, tmp); num = stoi(tmp);
    for (...) { getline(cin, line); ... }
    

最佳實踐建議

  • 混用 > 與 getline 時,**緊接在 >> 之後呼叫一次 getline 或 ignore** 成習慣。
  • 競賽/考試中為簡潔,常見寫法:cin >> num; string s; getline(cin, s);。
  • 若後續全用 getline,乾脆開頭就 getline(cin, s) 讀第一行再轉換。

理解「格式化輸入留下分隔符」特性,即可避免此類空行陷阱。

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