最近在學習C++ ,打好基礎是最重要
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:
#include<iostream>
using namespace std;
int main()
{
char a[10],b[10];
cin>>a;cin>>b;
cout<<a<<endl<<b<<endl;
}
輸入: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:
#include<iostream>
using namespace std;
int main()
{
char a,b,c,d;
a = cin.get();
b = cin.get();
c = cin.get();
d = cin.get();
cout<<int(a)<<','<<int(b)<<','<<int(c)<<','<<int(d)<<endl;
}
輸入:[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:
#include<iostream>
using namespace std;
int main()
{
int i;
char a[10];
cin.get(a,10,'.');
cout<<a;
}
輸入: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]
#include<iostream>
using namespace std;
int main()
{
char a[10];char b;
cin.get(a,10);
cin.get(b);
cout<<a<<endl<<int(b);
}
輸入:12345[enter]
輸出:12345 【換行】 10
說明:cin.get(a,10)把12345到a中,遇到[enter]結束,但是不把[enter]删除,則把[enter]輸入到b中,(enter的ASCALL碼為10)
#include<iostream>
using namespace std;
int main()
{
char a[10];char b;
cin.getline(a,10);
cin.get(b);
cout<<a<<endl<<int(b);
}
輸入: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
#include<iostream>
using namespace std;
int main()
{
char a[10];char b;
cin.get(a,10,',');
cin.get(b);
cout<<a<<endl<<b;
}
輸入:12345,[enter]
輸出:12345【換行】,
說明:cin,get不會删除緩沖區的,
#include<iostream>
using namespace std;
int main()
{
char a[10];char b;
cin.getline(a,10,',');
cin.get(b);
cout<<a<<endl<<int(b);
}
輸入:12345,[enter]
輸出:12345【換行】10
說明:cin.getline吧12345輸入到a中,遇到’,‘結束,并删除緩沖區的’,‘,後面的[enter]輸入到b中
4.運用—以任何符号作為輸入分隔符
例題:輸入五個學生的名字,每個學生的名字不超過10個字元,輸入時學生名字之間用逗号隔開,把這五個名字存儲并換行輸出
#include<iostream>
using namespace std;
int main()
{
char a[5][10];
int i;
for(i=0;i<4;i++)
cin.getline(a[i],10,',');
cin.getline(a[i],10);
for(i=0;i<5;i++)
cout<<a[i]<<endl;
}
這樣我們就可以完成完成用任何符号作為分割符的輸入了!此處getline換成get是不行的,因為cin.get不會删除緩沖區中的分隔符’,‘ 後續輸入不能繼續進行
轉載自https://blog.csdn.net/a1015553840/article/details/50579396