1. 程式人生 > >cin 和 getline 混用中需要註意的問題

cin 和 getline 混用中需要註意的問題

根據 out stream name mes pac 函數 地方 我們

這段時間在刷題過程中遇到一個cin和getline混合使用中的問題,解決之後記錄如下:

先來看一段代碼

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 int main() {
 6     string str;
 7     int n = 0;
 8     cin >> n;
 9     cout << "num: " << n << endl;
10     while (n--) {
11         getline(cin, str);
12 cout << "string: " << str << endl; 13 } 14 15 return 0; 16 }

這是一段很簡單的測試代碼,結果應該也是可以預期的,但結果仍然有些奇怪的地方

技術分享圖片

這裏沒有結果的輸出是怎麽回事?

我們先看下cin>>與getline的工作方式,流提取運算符根據它後面的變量類型讀取數據,從非空白符號開始,遇到Enter、Space、Tab鍵時結束。getline函數從istream中讀取一行數據,當遇到“\n”時結束返回。
造成程序錯誤結果的原因是,在輸入完相應的數字後按回車結束輸入,把“\n”留在了輸入流裏,而cin不會主動刪除輸入流內的換行符,這樣換行符就被getline讀取到,getline遇到換行符返回,程序不會等待下一個輸入,因此這裏出現了一個沒有結果的輸出,getline讀入了cin之後的回車換行符。

解決方案:

手動清除換行符,cin輸入結束後使用

cin.ignore();

就可以有效解決這個問題。

總結:

在cin和getline混合使用的過程中,使用cin.ignore()清除輸入流中的換行符。

cin 和 getline 混用中需要註意的問題