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

C++ 連續兩次 getline() 僅第一次無輸入:殘留換行符導致的緩衝區問題

     編輯:程式設計綜合問答

問題現象

代碼中先 cin >> choice,隨後連續兩次 getline(cin, str)。調試發現第一次 getline 直接返回空字符串,第二次才正常等待輸入。

代碼片段

while (cin >> choice) {
    if (choice == 1) {
        cout << "輸入明文:\n";
        string ming;
        getline(cin, ming); // 第一次:直接讀到空行
        cin.sync();
        cout << "輸入密文:\n";
        string mi;
        cin.sync();
        getline(cin, mi);   // 第二次:正常工作
        ...
    }
}

根本原因

cin >> choice 讀取整數後,**留下了換行符 \n 在輸入緩衝區中** 。
隨後的 getline(cin, ming) 遇到這個殘留的 \n,認為「讀完一行」(空行),立即返回空字符串,並消費掉該換行符。
第二次 getline 時緩衝區已空,正常等待用戶輸入。

解決方案(三種常用姿勢)

1. 緊跟 cin.ignore() 清理緩衝區(推薦)

cin >> choice;
cin.ignore(numeric_limits::max(), '\n'); // 丟棄至換行符
getline(cin, ming); // 正常工作

需包含 <limits> 頭文件。

2. 用 getline 統一讀取所有輸入,再轉換類型

string line;
getline(cin, line); // 讀整行
choice = stoi(line); // 轉整數
getline(cin, ming); // 直接讀下一行,無殘留問題

3. 針對性丟棄單個字符(簡單場景)

cin >> choice;
cin.get(); // 讀走殘留的 \n
getline(cin, ming);

缺點:若用戶輸入「123␣␣\n」多餘空格會殘留,不如方案 1 稳健。

最佳實踐建議

  • **統一輸入風格**:全程用 getline + 字符串解析,避免 >> 与 getline 混用。
  • 若必須混用,**每次 >> 後緊跟 cin.ignore()** 。
  • 避免使用 cin.sync() / fflush(stdin) —— 行為未定義/非標準。
  • 調試時打印字符 ASCII 碼(cout << (int)c)確認緩衝區內容。

擴展:同理可證

scanf("%d", &x) 後調用 fgets()/gets() 同樣會遇到殘留換行符,C 語言常用 getchar() 或 scanf("%*c") 清理。

牢記「格式化輸入留換行,整行讀取吃換行」這一規律,徹底告別此類坑。

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