古詩詞大全網 - 成語經典 - C++讀入字符串(cin,get,getline)

C++讀入字符串(cin,get,getline)

1、scanf

讀取時遇到空格就停止讀取

2、cin

cin空字符(包括回車符,制表符,空格,換行符)都會當成壹個輸入的結束

3、getline

讀取時遇到換行符結束

NOTE: 在默認情況下,getline()遇到換行符使停止讀入,所以必須保證在調用它之前緩沖區沒有任何多余的輸入。如:

輸入abc後,換行,再想輸入字符串是不行的,他會把abc給a,然後getline()遇到換行直接就停止了。

其實就是輸入abc後,結束字符會被getline讀取到,例如輸入fer空格 再輸入abc,那麽str等於空格+abc。

解決方法:在cin後面跟壹個cin.get()。

4、get

get用法同getline用法二

get和getline區別: 當遇到結束字符時,兩者的處理方式不同。getline()函數會將結束字符丟棄,不會保存在字符串裏,也不會保存在輸入隊列裏,對下壹次調用getline或者get沒有影響;而get()函數雖然同樣不會將結束字符保存在字符串裏,但會將它保存在輸入隊列裏,如果後面還有壹個get或者getline函數,會直接讀取到結束字符然後結束。解決方法是使用壹個不帶任何參數的cin.get()調用可讀取下壹個字符,處理到結束字符後再正常使用其他get或getline函數。

輸入隊列:相當於有個隊列在那裏,妳每輸入壹個字符就會進入隊列,cin等函數就是從隊列裏面壹個壹個的取數,cin和get在遇到結束字符的時候,直接停止讀取,不會把結束字符讀進字符串,但是不會把結束字符取出來,後面的get、getline函數還是會讀取到這個結束字符;而getline在遇到結束字符的時候,也不會把結束字符讀進字符串,但是會把結束字符取出來丟掉,那麽下壹個get、getline之類的函數就不會再讀取到這個結束字符,而是直接讀取到後面的內容。 比較神奇的是,如果後面跟的是cin並不受影響。 比如連續使用cin時,第二個cin並不會受到上壹個輸入的結束字符的影響,因為會自動忽略空白(空格、換行、制表符等)並從第壹個真正的字符開始讀起,直到遇到下壹處結束字符為止。

1)先來看壹看利用cin讀取字符串

cin使用空白(空格、制表符、換行符(通過回車符輸入))來確定字符串的結束位置,這意味著通過cin讀入字符數組時只讀取壹個單詞, 空白仍保留在流中 ,讀取該單詞後,cin將該字符串放在數組中,並自動在結尾加入空字符(‘\0’);流中單詞之前的空白將被忽視,而直接保存單詞;單詞之後的空格仍保存在流中!

2)再看看cin.getline(char*,int)讀取字符串

cin.getline(char ,int)將int-1個字符讀取到數組char 中,最後壹個位置用來存儲'\0'。該函數在讀取指定數目的字符或者遇到換行符時停止讀取。該函數從流中抽取出換行符,但不保存換行符。

3)再看看cin.get(void)讀取字符串

cin.get()往往用來從流中抽取換行符,防止下壹次讀入時因讀入換行符而提前結束。往往和get(a,b)結合使用,因為get(a,b)不從流中抽取換行符。

4)再看看cin.get(a)讀取字符串(壹個引用類型參數)

cin.get(ch)該讀取方法可以補救cin讀取方法的缺點,即可以將空白讀入並存儲,但是該方法只能壹個字符壹個字符讀取,往往對於字符串的讀取不太方便,故用的較少。

5)再看看cin.get(char *,int)讀取字符串(兩個參數)

cin.get(char ,int)與cin.getline(char ,int)函數很相似,唯壹不同的地方在於:get函數不從流中抽取換行符,換行符仍保留在流中,因為其後往往要跟cin.get(),用來抽取換行符。