1. 程式人生 > >cin 輸入空格符和 getline() 忽略開頭換行符

cin 輸入空格符和 getline() 忽略開頭換行符

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個字元後不再忽略