關於cin的get 和getline 成員函式

2021-07-14 15:05:48 字數 2726 閱讀 3756

cin是使用空白(空格,製表符,換行符)來確定字串的結束位置這意味著cin在獲取字元陣列時只讀取乙個單詞。讀取該單詞後cin自動在其結尾增加空字元。

這有時候很方便,有時候有使我們煩惱:如果我要輸入一句話來存入字串中呢?

要將整條短語而不是乙個單詞作為字串輸入,需要採用另一種字串讀取方法。

具體地說,需要採用面向行而不是面向單詞的方法。

istream的類cin提供了一些面向行的類成員函式:getline() and get()

這兩個函式都讀取一行輸入,直到遇到換行符為止。

不同的是getline()隨後將丟棄換行符,而get()將換行符保留在輸入序列中。

geiline的使用方法是cin.getline(char*, int)。

該函式有兩個引數,第乙個是你要儲存的目標,第二個是最多讀取多少位字元。如,若該引數為29,則最多讀取28個字元。餘下的空間是留給空字元的。

getline成員函式在讀取指定字元數或者遇到換行符時停止讀取。

注意,可以認為getline()讀取換行符,但隨後將換行符丟棄,換成空字元。

get成員函式有多重變體,其中有一種與getline相似,他們接受的引數個數相同,引數的解釋也相同,並且都讀取到行尾。

值得注意的是,get函式並不讀取並丟棄換行符,而是將其留在輸入序列中。這種特點如果不留意的話,會造成一些難以預料的麻煩。

下面舉個栗子,當我們連續兩次使用get():

cin.get(hobby, size);

第一次呼叫get()時,將換行符留在輸入佇列中,因此第二次呼叫時看到的第乙個字元便是換行符,因此第二個get函式會認為已經到達行尾,便不再讀取以下內容。

這個時候我們需要借助get函式的另一種變體,即不帶任何引數的get函式:cin.get(),它可以讀取下乙個字元,即使是換行符,因此可以用它來處理換行符。

它的呼叫形式可以是以下兩種:

//第一種:

cin.get(name, size);

cin.get();

cin.get(hobby, size);

cin.get();

//第二種:

cin.get(name, size).get();//之所以可以這樣做,是因為cin.get(name, size)返回乙個cin物件,

//這個物件隨後被用來訪問get成員函式。

cin.get(hobby, size).get();

char name[20];

cin >> year;

cin.getline(name, 20);

這種情況下name中儲存的不是我們輸入進去的字串,而是空字串。原因是cin在讀取year之後將換行符留在了輸入佇列,getline一開始就遇到換行符。

而我們以前連續呼叫cin不會產生讀取空字串的情況,是因為cin會自動忽略掉開頭的換行符。

另外再做一下說明:

getline(char*, int)成員函式和get(char*, int)成員函式不適合於c++的string類。

或者這麼說,適用於string類的getline函式並不是istream的成員函式,而是其友元函式,因此如果要讀取一行字串到string物件中,需要使用下面的格式:

getline(cin, str);
而get函式不適合於string類物件。

為什麼string類的物件搞特殊呢?這是歷史原因啦。

一種是接受乙個char型別作為引數:

cin.get(ch);
該函式返回乙個cin物件。

由於cin在需要的情況下可以轉為bool值,所以可以用cin.get(ch)函式來判斷輸入是否到達結尾:

cin.get(ch);

while (cin)

//或者採用更簡潔的表示:

while (cin.get(ch))

p.s.這裡的「輸入到達結尾」是指從鍵盤模擬的eof,windows下是ctrl + z + enter

另一種是

ch =cin.get();
while (ch != eof) 

//或者採用更簡潔的表示:

while ((ch = cin.get()) != eof)

在希望逐字節地讀取文字檔案或文字輸入時,可以使用這兩個函式。

為什麼不是cin >> ? 因為cin將自動地忽略空格,換行符,製表符,有時候,我們並不期待這種事情的發生。

下面是這兩個函式的區別:
屬性

cin.get(ch)

ch = cin.get()

傳遞輸入字元的方式

賦給引數ch

將函式返回值賦給ch

用於字元輸入時函式的返回值

istream物件(執行bool轉換後為true)

int型別的字元編碼

到達eof時函式的返回值

istream物件(執行bool轉換後為false)

eof

另外,cin.get(ch)還有乙個好處就是它可以拼接起來,如:

cin.get(ch1).get(ch2);
最後,指出下列cin成員函式也可以判斷輸入是否到達結尾:

cin.fail()

cin.eof()

關於cin和scanf速度的問題

在leetcode最優解法中常常看到 int型別引數 static int x string型別引數 int some 查了一下發現是解決 cin,cout效率低的問題 cin cout之所以效率低,是因為先把要輸出的東西存入緩衝區,再輸出,導致效率降低,而這段語句可以來打消iostream的輸入 ...

C 關於cin的使用

注 以下為個人見解,有可能錯誤,歡迎批評指出!cin的常用形式 1.cin 2.cin.get 3.cin.getline 基礎 當呼叫cin函式時,會自動從鍵盤緩衝區的讀取資料 如果沒有就請求使用者輸入 在讀取的過程中,若先遇到space enter tab這些會自動忽略掉。cin的輸入是不是逐個...

C 關於vector的輸入和cin的聯絡

我還是見識短淺,學到現在為止,我並沒有見過vector還可以用cin去進行輸入的寫法 例子 vectorv1,v2 開闢一維陣列 v1.resize 100 v2.resize 100 for int i 0 i 6 i cin v1 i cin v2 i 為什麼不resize直接cin輸入程式會崩...