天天看點

C++: cin.get()與cin.getline()C++: cin.get()與cin.getline()

C++: cin.get()與cin.getline()

标簽: C++ cin.get cin.getline

by 小威威

C++繼承了C的字元串,定義于

<cstring>

的頭檔案中。在下文中,對C中字元串簡稱為Cstring,對C++中字元串簡稱為string。

字元串的輸入有兩種類型:一種是單詞讀取(也就是不包括空格),另一種是行讀取(可以包含括号)。

對于單詞讀取,我們通常用istream中的cin;而對于行讀取,Cstring我們通常用類方法getline(),get()。下面我講着重講述這兩個類方法的差別以及注意的事項。

cin.getline()與cin.get()函數都可以讀取整行的字元串,他們的差別是:

cin.getline() 能夠讀取Enter鍵,并将之轉化為換行符。這樣就不會留一個Enter鍵在輸入流而對下一個字元串的輸入造成影響。而cin.get()不能夠讀取Enter鍵,而是将其繼續留在輸入流中,這樣有個弊端就是Enter鍵會對下一個Enter鍵造成影響。

如:

char str1[20];
char str2[20];
cin.getline(str1, 20);
cin.getline(str2,20);
           

因為getline不會留下Enter鍵在輸入流中,是以将兩個getline的類方法放在相鄰行不會出現問題。而如果用兩個get:

如:

char str1[];
char str2[];
cin.get(str1, );
cin.get(str2, );
           

這樣就會導緻str2無法輸入,因為第一個get()遺留下的Enter鍵被str2接收了。那麼,該怎麼解決呢?很簡單,就在兩個get函數之間加一個

cin.get()

或者直接在get函數後加:

如:

cin.get(str1,).get();
           

為什麼能這樣寫呢?

因為類方法get傳回的是cin對象,而get()函數是cin對象對應類的成員函數。為保險起見,我們可以在使用cin.get(name, lenth)的後面加上.get(),就像下面:

cin.get(str1, ).get();
cin.get(str2, ).get();
           

注意事項:

cin.getline()與cin.get()函數隻能對Cstring操作,不能對string類型操作。因為在沒有string類之前,

<iostream>

就已經存在了,它裡面沒有包含處理string類的成員函數。至于cin為什麼能實作string類型的輸入,書上說是string類的一個友元函數實作的(以後深入學習友元函數時再分析)。

那麼,string類是否有類似的字元串行讀取的函數呢?顯然是有的。那就是getline(cin,name)函數。

這個getline函數與前文講的getline函數不一樣。上文講到的getline函數是一個類方法,而這個getline不是。它的第一個參數是cin,表明了查找輸入字元串的位置。

再附加一個知識點:用函數傳回字元串大小。

在Cstring中,我們用strlen()函數測出長度。在string中,我們用size的類方法測出長度。但是有一個奇怪的地方:

char str1[20];
cout << strlen(str1) << endl;
           

輸出的數字是不确定的,甚至大于我們定義的20。原因是:未初始化的字元串數組’\0’的位置是不确定的。strlen函數是從第一個字元開始掃描知道出現’\0’位置。是以輸出的數字不确定。至于輸出的數字大于20很有可能是字元串數組内沒有’\0’,而是出現在字元串這段記憶體往後的位置。

以上内容皆為本人觀點,歡迎大家提出批評和指導,我們一起探讨!