1. 程式人生 > >C++中的getline()

C++中的getline()

總結:

儘量使用全域性函式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));

#include "stdafx.h"

#include<iostream>

#include <stdio.h>

#include <string>

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