1. 程式人生 > 其它 >C++中getline()和cin()同時使用時的注意事項

C++中getline()和cin()同時使用時的注意事項

技術標籤:細節

C++cin中getline使用時的注意事項


今天做tju的oj,遇到一個問題,想前部分用cin函式一個一個的讀入資料,中間部分利用getline()一起讀入一行,但是測試發現,cin之後的getline函式並無作用,遂谷歌之。原來cin只是在快取區中,把字元讀走,會剩餘/n在快取區中,但是getline對/n極度敏感,導致getline剛開始讀入便遇到/n於是停止讀入資料。
 例如一段程式碼:

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4  
 5
int main() 6 { 7 int age; 8 string name; 9 cout<<"請輸入年齡:"<<endl; 10 cin>>age; 11 cout<<"請輸入姓名:"<<endl; 12 getline(cin,name); 13 cout<<"年齡:"<<age<<endl; 14 cout<<"姓名:"<<
name<<endl; 15 return 0; 16 }

在這裡插入圖片描述
可以看出並沒有得到我們期望的結果,輸入姓名的程式碼沒有等待使用者輸入就被跳過。
我們先看下cin>>與getline的工作方式,流提取運算子根據它後面的變數型別讀取資料,從非空白符號開始,遇到Enter、Space、Tab鍵時結束。getline函式從istream中讀取一行資料,當遇到“\n”時結束返回。
造成程式錯誤結果的原因是,使用者輸入完年齡後按回車結束輸入,把“\n”留在了輸入流裡,而cin不會主動刪除輸入流內的換行符,這樣換行符就被getline讀取到,getline遇到換行符返回,因此程式不會等待使用者輸入。

解決的辦法是手動清除換行符,在cin>>後加上 cin.ignore();

因此在使用getline函式之前要注意,輸入流中是否有可能會有換行符,如果有則使用cin.ignore清除。

參考部落格原址:https://www.cnblogs.com/JeasonIsCoding/p/9848286.html