c++之cin/cin.get/cin.getline()詳解


 C++輸入過程中,是把輸入加載到緩沖區中,然后對緩沖區中的字符進行讀取。cin,cin,get(),cin.getline()三個函數雖然都能進行數據讀取,但是它們對緩沖區內數據的處理方法是不同的(如遇到[space],[enter]的處理方法)。本文將簡單介紹cin,cin.get(),cin.getline()的基本用法,從根本上解釋它們對緩沖區數據的處理方法。

 

1.cin的基本用法

    結束條件:[enter],[space],[tab]

    處理方法:cin遇到緩沖區中的[enter],[space],[tab]會結束當前輸入,並舍棄[enter],[space],[tab],繼續下一項輸入,當有連續[space],[enter,[tab]會全部舍棄。

程序1:

  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. int main()  
  5. {  
  6.     char a[10],b[10];  
  7.     cin>>a;cin>>b;  
  8.     cout<<a<<endl<<b<<endl;  
  9. }  

輸入:1234[enter]5678[enter]

 

輸出:1234  【此處換行】   5678

輸入:1234[enter][enter[enter]   ...   [enter]5678[enter]

輸出:1234  【此處換行】 5678   (說明不管緩沖區中有幾個enter,cin都會無視,直到不是enter開始繼續讀入)tab,space同理

綜上:cin的輸入很簡單,整體的看輸入,遇到[enter],[space],[tab]表示當前輸入結束,下一個輸入從非[enter],[sapce],[tab]開始,兩輸入間無線多個[space][]enter[tab]都是無效的

 

2.cin.get()基本用法

(1)一參數

用法:a = cin.get()  或者  cin.get(a)

結束條件:輸入字符足夠后回車

說明:這個是單字符的輸入,用途是輸入一個字符,把它的ASCALL碼存入到a中

處理方法:與cin不同,cin.get()在緩沖區遇到[enter],[space],[tab]不會作為舍棄,而是繼續留在緩沖區中

程序2: 

  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. int main()  
  5. {  
  6.     char a,b,c,d;  
  7.     a = cin.get();  
  8.     b = cin.get();  
  9.     c = cin.get();  
  10.     d = cin.get();  
  11.     cout<<int(a)<<','<<int(b)<<','<<int(c)<<','<<int(d)<<endl;  
  12. }  

輸入:[enter]  輸出:不會結束,因為需要輸入4個字符才結束(結束需要字符數夠后回車)

 

輸入:[enter][enter][enter][enter]      輸出:10,10,10,10  

輸入:abcdef[enter]     輸出:97,98,99,100   字符太多時取前幾個

輸入:[tab][enter][space]a[enter]     輸出:9,10,32,97(分別為[tab],[enter],[space],a的ASCALL碼)不舍棄[enter],[tab],[space],統一看成字符

綜上,一參數的cin.get()當輸入字符足夠后回車結束輸入,把回車[enter],空格[space]也看成字符,在緩沖區中遇到不舍棄。當輸入過多時,取前幾個。

(2)二參數

用法:cin.get(arrayname,size)  把字符輸入到arrayname中,長度不超過size

注釋:arrayname必須是char[]類型,即char數組類型,不可以為string類型;size是指輸入長度,即允許輸入的最大長度。

處理方法:假設把數據輸入到 char a[arraylength],數組長度為arraylength。cin.get(a,size)---size,arraylength不同可以分為四類:

類1:輸入串長<size,輸入串長>arraylength,會自動擴張arrayname大小,使能保存所有數據

例1:char a[10];cin,get(a,20);

輸入:123456789012[enter]

輸出a數組:123456789012 可以發現,輸入12個字符到a[10]中,系統自動擴充a[10],此時實際數組長為13(‘123456789012'\0'’)。但當計算sizeof(a)時,還是現實為10

類2:輸入串長<size,輸入串長<arraylength,把串全部輸入,后面補‘\0’

例2:char a[10];cin.get(a,20);

輸入:12345[enter] 

輸出:12345,此時數組內數據為‘12345‘\0’’

類3:輸入串長>size,先截取size個字符,若還是大於arraylength,則輸入前arraylength-1個字符,最后補充‘\0’

例3:char a[5];cin,get(a,10);

輸入:123456789012[enter]

輸出:123456789   先截取了9個字符變成‘123456789‘/0‘’,然后放入到a中,a自動擴張長度

類4:輸入串長>size,先截取size個字符,若小於arraylength,則把截取串放入數組中,最后補充‘\0’

 

例4:char a[15],cin.get(a,10)

輸入:123456789012[enter]

輸出:123456789   此時數組內為‘123456789‘\0’’   注意:前size-1有效,最后一個補‘\0’

綜上:當吧大於數組長度的字符串放出char a[arraylength]中,系統自動擴張數組a的長度使a能放得下,但是這么做容易產生運行錯誤

(3)三參數

用法:cin.get(arrayname,size,s)  把數據輸入到arrayname字符數組中,當到達長度size時結束或者遇到字符s時結束

注釋:a必須是字符數組,即char a[]l類型,不可為string類型;size為最大的輸入長度;s為控制,遇到s則當前輸入結束緩存區里的s將被舍棄

程序3: 

  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. int main()  
  5. {  
  6.     int i;  
  7.     char a[10];  
  8.     cin.get(a,10,'.');  
  9.     cout<<a;  
  10. }  

輸入:abc.123

 

輸出:abc    遇到  ’.‘ 輸入結束

 

3.cin.getline()基本用法

cin.getline()的用法和cin.get()用法大致相同,沒有一參數用法,只有二參數,三參數兩類

cin.gerline(arrayname,size)

cin.getline(arrayname,size,s)用法與cin.get()效果大致相同,但也有些區別

(1)cin.getline(arrayname,size)與cin.get(arrayname,size)的區別

cin.get(arrayname,size)當遇到[enter]時會結束目前輸入,他不會刪除緩沖區中的[enter]

cin.getline(arrayname,size)當遇到[enter]時會結束當前輸入,但是會刪除緩沖區中的[enter]

  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. int main()  
  5. {  
  6.     char a[10];char b;  
  7.         cin.get(a,10);  
  8.     cin.get(b);  
  9.     cout<<a<<endl<<int(b);  
  10. }  

輸入:12345[enter]

 

輸出:12345 【換行】 10

說明:cin.get(a,10)把12345到a中,遇到[enter]結束,但是不把[enter]刪除,則把[enter]輸入到b中,(enter的ASCALL碼為10)

  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. int main()  
  5. {  
  6.     char a[10];char b;  
  7.         cin.getline(a,10);  
  8.     cin.get(b);  
  9.     cout<<a<<endl<<int(b);  
  10. }  

輸入:12345[enter]a[enter]

 

輸出:12345【換行】97

說明:cin.getline(a,10)吧12345輸入到a中,遇到{enter}結束,並把緩沖區中[enter]刪除,把接下來的a輸入到b中
(2)cin.getline(arrayname,size,s)與cin.gei(arrayname,size,s)的區別

cin.getline(arrayname,size,s)當遇到s時會結束輸入,並把s從緩沖區中刪除

cin.get(arrayname,size,s)當遇到s時會結束輸入,但不會刪除緩沖區中的s

  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. int main()  
  5. {  
  6.     char a[10];char b;  
  7.     cin.get(a,10,',');  
  8.     cin.get(b);  
  9.     cout<<a<<endl<<b;  
  10. }  

輸入:12345,[enter]

 

輸出:12345【換行】,

說明:cin,get不會刪除緩沖區的,

  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. int main()  
  5. {  
  6.     char a[10];char b;  
  7.     cin.getline(a,10,',');  
  8.     cin.get(b);  
  9.     cout<<a<<endl<<int(b);  
  10. }  


輸入:12345,[enter]

 

輸出:12345【換行】10

說明:cin.getline吧12345輸入到a中,遇到’,‘結束,並刪除緩沖區的’,‘,后面的[enter]輸入到b中

 

4.運用---以任何符號作為輸入分隔符

例題:輸入五個學生的名字,每個學生的名字不超過10個字符,輸入時學生名字之間用逗號隔開,把這五個名字存儲並換行輸出

  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. int main()  
  5. {  
  6.     char a[5][10];  
  7.     int i;  
  8.     for(i=0;i<4;i++)  
  9.         cin.getline(a[i],10,',');  
  10.     cin.getline(a[i],10);  
  11.   
  12.     for(i=0;i<5;i++)  
  13.         cout<<a[i]<<endl;  
  14. }  



 

這樣我們就可以完成完成用任何符號作為分割符的輸入了!此處getline換成get是不行的,因為cin.get不會刪除緩沖區中的分隔符’,‘  后續輸入不能繼續進行

 

補充:getlinge()函數

getline函數其實有兩個:

  一個是全局函數,include<cstring>, 原型是istream& getline( istream& is, string& str, char delim)與 istream& getline( istream& is, string& str) ,得到的字符串存在一個string類型的str里。

  另一個是iostream類的成員函數, include<iostream>, 原型是 istream& getline( char * str, streamsize n, char delim ) istream& getline( char * str, streamsize n ) , 得到的字符串存在一個C-style字符數組str里。(值得注意的是,這個n應該小於字符數組str的長度,因為至少要留一個位置存放結束符'\0',后面這個還要探討一下)

  

  有關getline函數:參考一下這篇博客:https://blog.csdn.net/qq_33001647/article/details/54863824

 


免責聲明!

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



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