為什麼格式化提取後 std::getline() 會跳過輸入?


某些格式化提取後,std::getline() 會跳過輸入。我們可以利用下面的程式碼簡單地檢查這個錯誤:-

示例程式碼

#include <iostream>
#include <string>
using namespace std;

int main(){
   string name;
   string city;

   if (cin >> name && getline(cin, city)){
      cout << "Your name " << name << " and city " << city;
   }
}

輸出

Amal
Your name Amal and city

我們可以看到程式沒有接受第二個輸入。有時候它可以接受第二個輸入,但在輸出中只顯示第一個輸入。現在的問題是為什麼會出現這種現象?

此問題的主要原因是,當我們編寫第一個字串時,我們按下了回車鍵或返回鍵。當按下回車鍵或返回鍵時,它會在當前行後面插入‘\n’字元。這個字元導致了該問題。它忽略了字串的下一部分。

如果名稱為“Amal”,那麼它內部獲取的是“Amal\n”。要解決這個問題,一個選擇是在第一個提取後呼叫 std::cin.ignore()。然後它將丟棄下一個可用字元,這樣就可以正常工作了。

更新於: 30-Jul-2019

408 次瀏覽

啟動你的 職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.