C++中關於輸入cin的一些總結


(1)cin

在理解cin功能時,不得不提標准輸入緩沖區。當我們從鍵盤輸入字符串的時候需要敲一下回車鍵才能夠將這個字符串送入到緩沖區中,那么敲入的這個回車鍵(\r)會被轉換為一個換行符\n,這個換行符\n也會被存儲在cin的緩沖區中並且被當成一個字符來計算!比如我們在鍵盤上敲下了123456這個字符串,然后敲一下回車鍵(\r)將這個字符串送入了緩沖區中,那么此時緩沖區中的字節個數是7 ,而不是6。

cin讀取數據也是從緩沖區中獲取數據,緩沖區為空時,cin的成員函數會阻塞等待數據的到來,一旦緩沖區中有數據,就觸發cin的成員函數去讀取數據。

(2)cin>>

cin可以連續從鍵盤讀取想要的數據,以空格、tab或換行作為分隔符,即碰到分隔符,表示一個輸入的結束。當cin>>從緩沖區中讀取數據時,若緩沖區中第一個字符是空格、tab或換行這些分隔符時,cin>>會將其忽略並清除,繼續讀取下一個字符,若緩沖區為空,則繼續等待。但是如果讀取成功,字符后面的分隔符是殘留在緩沖區的,cin>>不做處理。

int a,b;
string c;
cin>>a>>b;
cin>>c;

輸入是1[enter]2[enter]a[enter],則a=1.b=2,c=a;輸入是[enter][enter]1[enter]..2a,則a=1,b=2,c=a;其中cin>>自動忽略了一開始的分隔符,直到遇到值賦給a,而且往后也是cin>>,只是寫成了連續賦值的形式,所以b之前的分隔符也被忽略了。而且如果輸入是1[enter]a[enter]因為輸入a和定義的int型b類型不符,所以不會賦值成功。

為什么說cin>>對字符后面的殘留在緩沖區的分隔符不做處理呢,我們可以驗證下,后面會說到cin.getline()讀取數據時,並非像cin>>那樣忽略第一個換行符,getline()發現cin的緩沖區中有一個殘留的換行符,不阻塞請求鍵盤輸入,直接讀取,送入目標字符串后,再將換行符替換為空字符’\0’

int a;
string b;
cin>>a>>b;
cin>>a;
getline(cin,b);

輸入:1[enter]hello[enter]  如果是用cin>>a>>b輸入的話,這樣兩個>>都會忽略字符前的分隔符的,結果為a=1,b=“hello”,但是如果是第二個輸入的方式,則getline不會將1后面的[enter]忽略掉,它會將其讀取到b中,因為是換行符,所以替換成'\0',代表結束,則hello會被屏蔽,但是依然存放在緩沖區里,這個時候再來一個,就會賦值進去。

(3)cin.get()讀取單個字符

cin.get()從輸入緩沖區讀取單個字符時不忽略分隔符,直接將其讀取

cin.get()的返回值是int類型,成功:讀取字符的ASCII碼值,遇到文件結束符時,返回EOF,即-1,Windows下標准輸入輸入文件結束符為Ctrl+z,Linux為Ctrl+d。cin.get(char var)如果成功返回的是cin對象,因此可以支持鏈式操作,如cin.get(b).get(c)。

char a,b;
a=cin.get();
cin.get(b);

輸入e[enter],這樣a=e,b=[enter],因為get不忽略分隔符。

(4)cin.get()讀取一行

char a;
char array[20]={NULL}; 
cin.get(array,20);
cin.get(a);
cout<<array<<" "<<a<<endl;

輸入:123213213[enter]  輸出:array=123213213,a=[enter];讀取一行時,遇到換行符時結束讀取,但是不對換行符進行處理,換行符仍然殘留在輸入緩沖區。第二次由cin.get()將換行符讀入變量a,換行符的ASCII碼值為10。這也是cin.get()讀取一行與使用getline讀取一行的區別所在。getline讀取一行字符時,默認遇到’\n’時終止,並且將’\n’直接從輸入緩沖區中刪除掉,不會影響下面的輸入處理。

(5)cin.getline()

從標准輸入設備鍵盤讀取一串字符串,並以指定的結束符結束

getline函數從輸入流中讀取數據,一般作為string型的輸入使用。cin.getline()實際上有三個參數,cin.getline(接受字符串的字符串地址,接受個數,結束字符) 
當第三個參數省略時,系統默認為'\0' 

cin.getline與cin.get的區別是,cin.getline不會將結束符或者換行符殘留在輸入緩沖區中。

(6)getline()

和cin.getline()類似,但是cin.getline()屬於istream流,而getline()屬於string流,是不一樣的兩個函數

在遇到需要輸入一串帶有空格的字符串的時候,要用getline(cin,s),因為cin>>s,遇到空格就會默認停止。

(7)cin.clear()和cin.ignore()

①cin.ignore清空了輸入緩沖區的當前行,使上次的輸入殘留下的數據沒有影響到下一次的輸入,這就是ignore()函數的主要作用。其中,numeric_limits::max()不過是頭文件定義的流使用的最大值,你也可以用一個足夠大的整數代替它。 
②如果想清空輸入緩沖區,去掉換行符,使用: 
cin.ignore(numeric_limits< std::streamsize>::max()); 清除cin里所有內容。

③cin.ignore();當輸入緩沖區沒有數據時,也會阻塞等待數據的到來。

 

https://blog.csdn.net/k346k346/article/details/48213811

http://www.cnblogs.com/flatfoosie/archive/2010/12/22/1914055.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM