cin>>和getline混用需謹慎

我們先來看一段輸入流cin>>和getline混用的代碼:

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

int main()
{
    int age;
    string name;
    cout<<"請輸入年齡:"<<endl;
    cin>>age;
    cout<<"請輸入姓名:"<<endl;
    getline(cin,name);
    cout<<"年齡:"<<age<<endl;
    cout<<"姓名:"<<name<<endl;
    return 0;
}

不難看出這段代碼的初衷是通過輸入流、輸入流提取運算符cin>>和getline分別從命令行獲取年齡age和姓名name,但是運行後的結果如下:

未加cin.ignore

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

cin.ignore();

這樣即可得到正確結果:

加上cin.ignore後

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章