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


  今天做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清除。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM