總結:
盡量使用全局函數string類中的getline(),其讀入的第二個參數為string類型,不設置默認是遇到回車停止讀入操作
cin.getline是針對數組字符串的,以指定的地址為存放第一個讀取的字符的位置,依次向后存放讀取的字符,直到讀滿N-1個,或者遇到指定的結束符為止
全局函數的getline(cin,str);處理后還留有結束符在輸入流中,故需要使用cin.get();//接受最后一個結束符,才能接受后面得輸入值。
一、string類的getline函數(全局函數)
getline(cin,str)函數是處理string類的函數。第二個參數為string類型的變量。讀入時第二個參數為string類型,而不是char*,要注意區別
getline()函數的定義如下所示
1. istream& getline ( istream &is , string &str , char delim );
2. istream& getline ( istream &is , string &str );
is 進行讀入操作的輸入流
str 用來存儲讀入的內容
delim 終結符,遇到該字符停止讀取操作,不寫的話默認為回車,如定義2中的示例。
函數的返回值:
與參數is一樣。
前方預警,請各位看官注意!!!
所以在使用while(getline(cin,line))的時候,判斷while()是否結束循環的條件不是輸入流是否輸入了回車(或getline函數里你自己定義的結束符),而是getline這個函數是否輸入無效(這么說好像有點繞,給你們來個爽快的)。直到你輸入了EOF或者ctrl+z,while循環才會結束,而且要注意的是,只有getline函數動作完畢時,while才會執行內部的循環,例如
while(getline(cin,str))
{
cout<<str<<endl;
}
直到你輸入了回車或者你自己設定的結束符,str這個字符串才會被輸出。
讓我們一起來分析一下while(getline(cin,line))語句
注意這里默認回車符停止讀入,按Ctrl+Z或鍵入EOF回車即可退出循環。
在這個語句中,首先getline從標准輸入設備上讀入字符,然后返回給輸入流cin,注意了,是cin,所以while判斷語句的真實判斷對象是cin,也就是判斷當前是否存在有效的輸入流。在這種情況下,我想只要你的電腦不中毒不發神經你的輸入流怎么會沒有效?所以這種情況下不管你怎么輸入都跳不出循環,因為你的輸入流有效,跳不出循環。
然而有些同學誤以為while判斷語句的判斷對象是line(也就是line是否為空),然后想通過直接回車(即輸入一個空的line)跳出循環,卻發現怎么也跳不出循環。這是因為你的回車只會終止getline()函數的讀入操作。getline()函數終止后又進行while()判斷(即判斷輸入流是否有效,你的輸入流當然有效,滿足條件),所以又運行getline()函數,導致程序永遠跳不出循環。
注意:上面講到的getline(cin,str)實際是一個全局函數,本身屬於string類。所以你使用該函數的時候請記得添加#include <string>頭文件。下面介紹一個與getline很相似的函數cin.getline。
cin.getline()函數是處理數組字符串的,其原型為cin.getline(char * , int),第一個參數為一個char指針,第二個參數為數組字符串長度。
cin.getline()當輸入超長時,會引起cin函數的錯誤,后面的cin操作將不再執行。如下代碼:
-
void test_input()
-
{
-
char ch1,ch2[10];
-
cout<<"請輸入字符串:"<<endl;
-
cin.getline(ch2,6);//在不遇到結束符的情況下,最多可接收6-1=5個字符到ch2中
-
cin>>ch1;
-
cout<<ch2<<endl;
-
cout<<ch1<<"\n"<<(int)ch1<<endl;
-
}
- 測試:如下圖,輸入zifuchuan[Enter],長度大於最大長度5,就會導致cin函數錯誤,其后既沒有像cin.get()一樣直接從輸入緩沖區直接讀數據,也沒有從鍵盤輸入。所以此處可以注意,考慮在用cin.getline()時,適度設置其最大接受長度大一點。
cin.getline()
此函數會一次讀取多個字符(包括空白字符)。它以指定的地址為存放第一個讀取的字符的位置,依次向后存放讀取的字符,直到讀滿N-1個,或者遇到指定的結束符為止。若不指定結束符,則默認結束符為'\n'。其語法為:
cin.getline(字符指針(char*),字符個數N(int),結束符(char));
-
-
-
-
-
using namespace std;
-
-
int main()
-
{
-
char a[30];
-
cout << "請輸入一個字符串:" << endl;
-
cin.getline(a, 10);//第10位存放字符串結束符'\0'
-
for (int i = 0; i<10; i++)
-
cout << "第"<<i+1<<"個值為:"<<a[i] << endl;
-
-
return 0;
-
}
輸入:1234567890123
輸出:1 2 3 4 5 6 7 8 9 _ (第10位存放字符串結束符'\0')
引自https://blog.csdn.net/livecoldsun/article/details/25489429和https://blog.csdn.net/u013660169/article/details/41726973和https://blog.csdn.net/xumengxing/article/details/6664436和https://blog.csdn.net/duan19920101/article/details/50782816