關(guān)于cin輸入的問題
??
原理:?? 程序的輸入都會(huì)提前建立一個(gè)緩沖區(qū),即輸入緩沖區(qū)。一次輸入過程是這樣的,當(dāng)一次鍵盤輸入將輸入的數(shù)據(jù)存入輸入緩沖區(qū),而cin函數(shù)直接從輸入緩沖區(qū)中
取得數(shù)據(jù)。正因?yàn)閏in函數(shù)是直接從緩沖區(qū)去數(shù)據(jù)的,所以有時(shí)候當(dāng)緩沖區(qū)中有殘留數(shù)據(jù)時(shí),cin函數(shù)會(huì)直接取得這些殘留數(shù)據(jù)而不會(huì)請(qǐng)求鍵盤輸入(容易忽略的點(diǎn))
#include
using namespace std;
int main()
{
char s[6];
cin.getlint(s,4);
cout<cin.getlint(s,4);cout<return 0;}輸入:abcdef(enter)輸出:abc?【分析】之所以第一次輸入完后直接程序就結(jié)束了,而不是進(jìn)行第二次輸入,是因?yàn)榈谝淮味噍斎氲臄?shù)據(jù)還殘留在緩沖區(qū)中,第二次輸入就直接從緩沖區(qū)中提取而不會(huì)在請(qǐng)求鍵盤輸入,一下探究幾種常見的輸入方式:?一,cin>>該操作符是根據(jù)后面變量的類型讀取數(shù)據(jù)。輸入結(jié)束條件:遇到Enter,Space,Tab鍵。對(duì)結(jié)束符的處理:丟棄緩沖區(qū)中使得輸入結(jié)束的結(jié)束符(Enter,Space,Tab)eg2:#includeusing namespace std;int main(){char s1[10],s2[10];cin>>s1;cin>>s2;cout< cout< return 0;}?輸入:abcd efgh輸出:abcdefgh【分析】第一次讀取字符串時(shí)遇到空格則停止了,將abcd讀入s1,并舍棄了空格,將后面的字符串給了第二個(gè)字符串,這證明了cin讀入數(shù)據(jù)遇到空格結(jié)束,并且丟棄空格符;緩沖區(qū)有殘留數(shù)據(jù),讀入操作直接從緩沖區(qū)中去數(shù)據(jù)。?二,cin.get(數(shù)組名,長(zhǎng)度,結(jié)束符)其中結(jié)束符為可選參數(shù),讀入的字符個(gè)數(shù)最多為(長(zhǎng)度-1)個(gè),結(jié)束符規(guī)定結(jié)束字符串讀取的字符,默認(rèn)為enter,若要讀取字符,直接cin.get(char ch)或ch=cin.get()讀取字符的情況:輸入結(jié)束條件:enter鍵對(duì)結(jié)束符處理:不丟棄緩沖區(qū)中的entercin.get()與cin.get(char ch)用于讀取字符,他們的使用是相識(shí)的,即:ch=cin.get()與cin.get(ch)是等價(jià)的。?eg3:#includeusing namespace std; int main() { char c1, c2; ? cin.get(c1); ? cin.get(c2); ??? cout< ?輸入:a[Enter]輸出:a97 10【分析】會(huì)發(fā)現(xiàn)只執(zhí)行一次從鍵盤輸入,顯然第一個(gè)字符變量取得a,第二個(gè)變量取得是Enter,這是一位改函數(shù)不丟棄上次輸入結(jié)束時(shí)的Enter字符,所以第一次輸入結(jié)束時(shí)緩沖區(qū)中殘留的是上次輸入結(jié)束是的Enter字符!?輸入:a b[enter]輸出:a97 32【分析】顯然第一個(gè)字符變量取的‘a(chǎn)’,第二個(gè)變量取的是Space,原因同上,沒有丟棄space字符,讀取字符串的情況:輸入結(jié)束條件:默認(rèn)enter鍵(因此可接受空格,Tab鍵),可在第三個(gè)參數(shù)上定義結(jié)束符對(duì)結(jié)束符處理:丟棄緩沖區(qū)的enter?eg4:#includeusing namespace std;int main(){char ch,a[20];cin.get(a,5,'d');cin>>ch;cout<cout<<(int)ch< return 0;}?輸入:12345[enter]輸出:123453【分析】第一次輸入超長(zhǎng),字符串按長(zhǎng)度取了“1234”,而‘5’仍殘留在緩沖區(qū)中,所以第二次輸入字符沒有從鍵盤讀入,而是直接去了‘5’,所以打印的是53?輸入:12d45[enter]輸出:12d【分析】第二次輸出為d,說明自定義結(jié)束符時(shí)不丟棄緩沖區(qū)中的結(jié)束符?三,cin.getline()?cin.getline(數(shù)組名,長(zhǎng)度,結(jié)束符)大體與cin.get(數(shù)組名,長(zhǎng)度,結(jié)束符)類似?區(qū)別在于:cin.get()當(dāng)輸入的字符串超長(zhǎng)時(shí),不會(huì)引起cin函數(shù)的錯(cuò)誤,后面的cin操作符會(huì)繼續(xù)執(zhí)行,只是直接從緩沖區(qū)中取數(shù)據(jù),但是cin.getline()當(dāng)輸入超長(zhǎng)是開會(huì)引起cin函數(shù)的錯(cuò)誤,后面的cin操作將不再執(zhí)行。?eg5:#includeusing namespace std; int main () { char ch, a[20]; cin.getline(a, 5); cin>>ch; cout< ?輸入:12345[enter]輸出:1234-52【分析】與cin.get()的列子比較會(huì)發(fā)現(xiàn),這里的ch并沒有讀取緩沖區(qū)中的5,而是返回了-52,這里其實(shí)cin>>ch語(yǔ)句沒有執(zhí)行,是因?yàn)閏in出錯(cuò)了!??