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

C++ 混用 getline 與 cin 導致程式卡住?換行符殘留是元兇

     編輯:程式設計綜合問答

程式碼中先用 getline(cin, str) 讀整行,再用 cin >> num 讀整數,結果迴圈跑不出去。原因是 getline 讀取並丟棄換行符,但 cin >> num 讀完整數後**留下換行符在緩衝區**,下一輪 getline 直接讀到這個空行,導致邏輯異常。

問題代碼片段

while (getline(cin, str)) {
    istringstream record(str);
    record >> name >> number;
    cout << "string" << endl;
    cin >> num;  // 讀完整數後,'\n' 留在緩衝區
}

解決方案

  1. 讀完整數後清除緩衝區:
    cin >> num;
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 丟棄剩餘換行符
    
  2. 統一用 getline 讀行,再用 stringstream 解析(推薦):
    string line;
    while (getline(cin, line)) {
        if (line.empty()) continue;
        istringstream iss(line);
        if (iss >> name >> number) {
            // 處理 name, number
            getline(cin, line); // 讀取下一行作為 num
            istringstream iss2(line);
            iss2 >> num;
        }
    }
    

核心原則

不要在同一程式中混用 formatted input (operator>>) 與 unformatted input (getline/get),除非你手動管理緩衝區換行符。

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