cin 輸入空格符和 getline() 忽略開頭換行符
阿新 • • 發佈:2019-01-09
1、輸入空格符
getline() 函式實際上有三個引數,第三個引數指定字串的結束符,也就是當 getline() 函式遇到這個字元時,就不再接受輸入了。例如
getline(cin, str, 's');
即使輸入的是 abcsdef ,讀入到 str 的內容卻只有 abc ,因為遇到字元 ‘s’ 時,getline() 便停止讀入了。
即輸入 abcsabc 按回車鍵後,程式以 enter 作為輸入完成的訊號,getline() 函式開始讀入緩衝區的內容,它將結束符 ‘s’ 前的部分讀入到變數 str ,捨棄結束符 's' 及其後面的部分。
下面這段程式碼需要按兩次回車鍵才能執行 cout 進行列印,則是因為 getline() 預設情況下以回車 ('/n') 作為結束符。第一次按回車時, getline() 將其作為讀入的結束符,而非輸入完成訊號,第二次按回車才是輸入完成的訊號。
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
getline(cin,s);
cout<<s;
return 0;
}
那麼,當程式迴圈呼叫 getline(cin, s) 時,如果不做任何處理,每隔一次的開頭輸入都是上次的輸入完成訊號即 enter,由於 getline() 並不忽略行開頭的換行符,只要 getline() 遇到換行符,哪怕是第一個字元,getline() 也會將它作為本次輸入的字串結束符,它將會把本次輸入的內容捨棄,而將開頭的 enter 之前的部分(為空字元)讀入到目標變數 ,導致第二次呼叫時讀入變數的是空字元。
可以使用小節 2 中給出的方法解決該問題。
2、使用 cin.clear() 或 cin.ignore() 跳過最開始的終止符。例如
#include<iostream> #include<string> using namespace std; int main() { char str[8]; cin.getline(str, 5); cout << str << endl; cin.clear(); // 如果這裡沒有 clear,那麼下面的輸入就被忽略了,因為 cin 標誌未清除 cin.getline(str, 5); cout <<str <<endl; system( "pause "); return 0; }
也可以用 cin.ignore(1)忽略一個字元,或cin.ignore(1024,'/n'),在遇到換行後或者忽略了1024個字元後不再忽略。