在getline的代碼上方使用過cin流來獲取過鍵盤輸入時,getline會出現直接跳過。
#include<bits/stdc++.h>
using namespace std;
int mian()
{
int x = 0;
cin >> x;
//cin.ignore();
//cin.sync();
string str;
getline(cin, str);
cout << str << endl;
system("pause");
return 0;
}
這段代碼可以如期進行嗎?
肯定是不行的,不然我也不會寫出來。。。
這時候輸入了 x
之後,程序就直接結束了。爲啥呢?
因爲cin流中還殘餘了換行符,getline()
就直接讀入換行符,然後程序結束。
想要解決這個問題,可以加上第8行註釋中的語句,清空cin流,然後就可以正常輸入字符串到 str
中了。
cin.ignore(int a = 1, char ch = EOF)
這個函數會忽略 a
個字符,直到字符是 ch
爲止。
在這裏 cin.sync()
也有同樣的功能。
cin流失效
在搜索資料的過程中又發現了cin流失效的問題。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int x = 0;
cin >> x; //如果此時輸入字母a
cout << "x = " << x << endl;
//cin.clear();
//cin.ignore();
cin >> x;
cout << "x = " << x << endl;
string str;
getline(cin, str);
cout << str << endl;
system("pause");
return 0;
}
如果程序運行到第八行時輸入了字母 a ,因爲接收字母 a 的變量是 int 類型的,此時cin流會出錯, cin.fail() == 1
。cin流會失效後,會直接輸出 x = 0
。
此時如果第二個 cin >> x
想要正常輸入,則需要將第11,12行中語句加上,cin.clear()
是重置錯誤標誌位,cin.ignore()
是清除一個cin流中的字符。加上這兩句後就可以正常輸入數字到 x
中了。
推介看看參考4,有非常多具體實例,還討論了cin.clear()
和 cin.ignore()
的使用先後順序問題(先使用 cin.clear()
重置錯誤標誌位,然後清空cin緩存區)。
先使用cin.ignore()然後用getline()讀入一行,會少一個字符
#include<bits/stdc++.h>
using namespace std;
int main()
{
cin.ignore(5, '\n');
string str;
getline(cin, str);
cout << str << endl;
system("pause");
return 0;
}
這個簡單示例,就更進一步演示了 cin.ignore()
的功能,就是忽略cin流中指定數目的字符,直到遇到指定字符。
參考1:link1
參考2:link2
參考3:link3
參考4:link4