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

C++ `cin.get()` 吃掉殘留換行符:`cin >>` 留下 `\n` 導致 `cin.getline` 直接讀到空行

     編輯:程式設計疑難解答

代碼中 `cin >> exp->radius;` 讀取整數後,**緩衝區殘留換行符 `\n`**,接著 `cin.get(exp->band, 20)` 讀取字串時,`getline`/`get` 遇到 `\n` 視為結束,直接讀到空字串,導致無法輸入品牌名。

流程圖解


輸入:123\n          ← 使用者輸入半徑 123 並按 Enter
cin >> radius  → 讀走 123,緩衝區剩 \n
cin.get()      → 吃掉這個 \n
cin.get(band)  → 正常等待品牌輸入

解決方法

  1. `cin.get()` / `cin.ignore()` 吃掉單一殘留字元:
    
    cin >> radius;
    cin.ignore(); // 或 cin.get(),吃掉一個字元(通常是 \n)
    cin.get(band, 20);
    
  2. `cin.ignore(numeric_limits::max(), '\n')` 吃掉整行(更稳健):
    
    #include 
    cin >> radius;
    cin.ignore(std::numeric_limits::max(), '\n'); // 清空到換行
    cin.get(band, 20);
    
  3. 統一用 `getline` 讀整行再解析(推薦現代寫法):
    
    string line;
    getline(cin, line); radius = stoi(line);
    getline(cin, band);
    getline(cin, line); weight = stoi(line);
    

關鍵差異

函式行為殘留 \n
`cin >>`跳過前導空白,讀到空白停止**留下 \n**
`cin.get()`讀單一字元(含 \n)吃掉 \n
`cin.getline()` / `getline(cin, str)`讀整行(不含 \n)吃掉 \n

養成「`>>` 後緊接 `ignore()`」或「全程用 `getline`」習慣,徹底避免緩衝區殘留問題。

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