c语言cin输入数组,C++基础:各种输入方法总结cin.get()、
原標(biāo)題:C++基礎(chǔ):各種輸入方法總結(jié)cin.get()、
在C++中,各種輸入方法還是不少的,而且各有所異,本文做一點(diǎn)簡要總結(jié),主要涉及如下內(nèi)容:cin、cin.get()、cin.getline()、getline()、gets()、getchar()。
輸入原理簡述:
程序的輸入都建有一個(gè)緩沖區(qū),即輸入緩沖區(qū)。每次輸入過程是這樣的,當(dāng)一次鍵盤輸入結(jié)束時(shí)會(huì)將輸入的數(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)求鍵盤輸入。
比如下面的例子:
1
2
3
4
5
6
7
8
9
void test_input()
{
string str;
cout<
cin>>str;
cout<
cin>>str;
cout<
}
由于cin在遇到空格時(shí),就會(huì)停止輸入,所以如果我在第一次輸入時(shí),利用空格隔開兩個(gè)字符串,那么cin在第一次取的時(shí)候,只會(huì)讀取前一個(gè)字符串,到空格結(jié)束,此時(shí)緩沖區(qū)還保留著前面輸入的第二個(gè)字符串,那么第二次cin就會(huì)直接從緩沖區(qū)取殘留數(shù)據(jù),而不會(huì)請(qǐng)求輸入。
當(dāng)然對(duì)于以上的情況,也有解決的方案,那就是在第二次調(diào)用cin>>str,之前通過cin.sync()來清空輸入緩沖區(qū),看一下下面的例子,此處不贅述:
1
2
3
4
5
6
7
8
9
10
void test_input()
{
string str;
cout<
cin>>str;
cin.sync();
cout<
cin>>str;
cout<
}
各種輸入方法簡介:
1、cin>>
根據(jù)cin>>sth 中sth的變量類型讀取數(shù)據(jù),這里變量類型可以為int,float,char,char*,string等諸多類型。這一輸入操作,在遇到結(jié)束符(Space、Tab、Enter)就結(jié)束,且對(duì)于結(jié)束符,并不保存到sth中。
1
2
3
4
5
6
7
8
9
10
void test_input()
{
char ch1[10],ch2[10];
cout<
cin>>ch1;
cin>>ch2;
cout<
cout<
cout<
}
2、cin.get(字符數(shù)組名,接收長度,結(jié)束符)
其中結(jié)束符意味著遇到該符號(hào)結(jié)束字符串讀取,默認(rèn)為ENTER,讀取的字符個(gè)數(shù)最多為(長度-1),因?yàn)樽詈笠粋€(gè)為”n”。要注意的是,cin.get()操作遇到結(jié)束符停止讀取,但并不會(huì)將結(jié)束符從緩沖區(qū)丟棄。cin.get()有如下幾種用法:
(1)接收一個(gè)字符ch=cin.get()或cin.get(char ch),二者等價(jià),看兩個(gè)例子
1
2
3
4
5
6
7
8
9
void test_input()
{
char ch1,ch2;
cout<
cin.get(ch1);//或ch1 = cin.get();
cin.get(ch2);
cout<
cout<
}
來看幾組測(cè)試:
連續(xù)輸入ab[enter],結(jié)果正常,ch1,ch2分別讀取了a、b,將其輸出,然后在輸出其ASCII值。要注意的是,以上輸入并讀取后,緩沖區(qū)中依然存在[Enter]沒有被刪除。
輸入a[Space]b[Enter],結(jié)果在輸出時(shí),只看到了a,輸出ASCII值時(shí)候分別為97 32(空格的ASCII值),這就說明cin.get()并不會(huì)舍棄Space,依然會(huì)將其讀取進(jìn)去,并加以顯示等操作。
輸入a[Enter],輸出見下圖。在輸出a之后,第二次的輸出產(chǎn)生了換行的效果,而輸出的第二個(gè)ASCII值為10(Enter的ASCII值),這就進(jìn)一步響應(yīng)了前面說到的cin.get()遇到結(jié)束符并不會(huì)將之刪除。
(2)接收一定長度的字符串cin.get(字符數(shù)組名,接收長度,結(jié)束符),結(jié)束符為可選參數(shù),默認(rèn)為Enter,可以接受Space 、Tab,對(duì)于結(jié)束符的處理要注意,結(jié)束符并不會(huì)丟掉,同樣看幾個(gè)例子。
對(duì)于如下代碼,所做的操作時(shí),在不遇到enter時(shí)最多讀入(6-1)=5個(gè)字符到ch2中,然后讀入下一個(gè)字符到ch1中,顯示ch2,ch1以及其ASCII碼值。附上幾組測(cè)試:
1
2
3
4
5
6
7
8
9
void test_input()
{
char ch1,ch2[10];
cout<
cin.get(ch2,6);//在不遇到結(jié)束符的情況下,最多可接收6-1=5個(gè)字符到ch2中,注意結(jié)束符為默認(rèn)Enter
cin.get(ch1);//或ch1 = cin.get();
cout<
cout<
}
輸入:zifuchuan[Enter],由于輸入長度大于(6-1)=5,所以會(huì)首先讀入“zifuc”到ch1,此時(shí)“huan”仍在緩沖區(qū),當(dāng)執(zhí)行cin.get(ch1)會(huì)直接從緩沖區(qū)讀入h,而不需要申請(qǐng)從鍵盤輸入,看一下結(jié)果,符合分析。
輸入:zifu[Enter],此時(shí)輸入長度小于5就遇到了默認(rèn)結(jié)束符Enter,則ch2中只讀入“zifu”,要注意的是,輸入緩沖區(qū)里面的Enter還在,所以接下來要讀入的ch1的內(nèi)容將是Enter,而輸出時(shí)將看到換行,ASCII碼值為10,見下圖
輸入:zi fuchuan[Enter],注意中間的空格,cin.get()對(duì)空格并不敏感,依然會(huì)讀入,故而ch2讀入的是“zi fu”,ch1讀入的是c
(3)cin.get( ),注意此時(shí)沒有參數(shù)可用于舍棄輸入流中的不需要的字符,或者舍棄回車,彌補(bǔ)cin.get(字符數(shù)組名,字符數(shù)目,結(jié)束符)的不足。對(duì)(2)中的代碼加入一句話cin.get()如下:
1
2
3
4
5
6
7
8
9
10
void test_input()
{
char ch1,ch2[10];
cout<
cin.get(ch2,6);//在不遇到結(jié)束符的情況下,最多可接收6-1=5個(gè)字符到ch2中
cin.get();//注意:前面兩句可以寫到一塊:cin.get(ch2,6).get();
cin.get(ch1);//或ch1 = cin.get();
cout<
cout<
}
前面遇到的一個(gè)狀況是,輸入字符后,其結(jié)束符(如默認(rèn)的Enter)會(huì)保留在緩沖區(qū)中,當(dāng)下次讀入時(shí),又會(huì)再讀入,此時(shí)就可以用到cin.get()獨(dú)釣輸入緩沖區(qū)不需要的字符,如:輸入:zi[Enter],由于遇到結(jié)束符,所以ch2內(nèi)容為zi,此時(shí)輸入緩沖區(qū)還存在著[Enter],但cin.get()將其舍棄掉之后,cin.get(ch1)就會(huì)申請(qǐng)從鍵盤輸入內(nèi)容,如下所示:
3、cin.getline(字符數(shù)組名,接收長度,結(jié)束符)
其用法與cin.get(字符數(shù)組名,接收長度,結(jié)束符)極為類似。cin.get()當(dāng)輸入的字符串超長時(shí),不會(huì)引起cin函數(shù)的錯(cuò)誤,后面若有cin操作,會(huì)繼續(xù)執(zhí)行,只是直接從緩沖區(qū)中取數(shù)據(jù)。但是cin.getline()當(dāng)輸入超長時(shí),會(huì)引起cin函數(shù)的錯(cuò)誤,后面的cin操作將不再執(zhí)行。如下代碼:
1
2
3
4
5
6
7
8
9
void test_input()
{
char ch1,ch2[10];
cout<
cin.getline(ch2,6);//在不遇到結(jié)束符的情況下,最多可接收6-1=5個(gè)字符到ch2中
cin>>ch1;
cout<
cout<
}
測(cè)試:如下圖,輸入zifuchuan[Enter],長度大于最大長度5,就會(huì)導(dǎo)致cin函數(shù)錯(cuò)誤,其后既沒有像cin.get()一樣直接從輸入緩沖區(qū)直接讀數(shù)據(jù),也沒有從鍵盤輸入。所以此處可以注意,考慮在用cin.getline()時(shí),適度設(shè)置其最大接受長度大一點(diǎn)。
4、getline(istream is,string str,結(jié)束符)
同樣,此處結(jié)束符為可選參數(shù)(默認(rèn)依然為Enter)。然而,getline()與前面的諸多存在的差別在于,它string庫函數(shù)下,而非前面的istream流,所有調(diào)用前要在前面加入#include。與之對(duì)應(yīng)這一方法讀入時(shí)第二個(gè)參數(shù)為string類型,而不再是char*,要注意區(qū)別。另外,該方法也不是遇到空格就結(jié)束輸入的。
1
2
3
4
5
6
7
void test_input()
{
string str;
cout<
getline(cin,str,'a');
cout<
}
通過以上第二個(gè)圖還可以看出,這一方法只有在遇到結(jié)束符(此處為‘a(chǎn)’)才結(jié)束,對(duì)空格甚至回車都不敏感。
5、gets(char *ch)
gets()方法同樣接受一個(gè)字符串,但是與getline()不同,它的參數(shù)為char*,而不是string,另外若定義char ch[n],長度為n,則樣注意輸入的字符串長度不要大于n,否則會(huì)報(bào)錯(cuò)。同樣gets()對(duì)空格也不敏感。
1
2
3
4
5
6
7
void test_input()
{
char ch[10];
cout<
gets(ch);
cout<
}
好吧,就到這里吧,其實(shí)還有g(shù)etchar()、getch()等,這里就不一一贅述了。
現(xiàn)在有很多小伙伴在自學(xué),但是一個(gè)人的能力總是有限的,遇到問題沒人幫你解決,平時(shí)提供大家一起學(xué)習(xí)C++,每天免費(fèi)C++課程知識(shí)講解。我們有一個(gè)C++的學(xué)習(xí)交流qq群,點(diǎn)擊鏈接加入群【https://jq.qq.com/?_wv=1027&k=424tWQd】學(xué)習(xí)返回搜狐,查看更多
責(zé)任編輯:
總結(jié)
以上是生活随笔為你收集整理的c语言cin输入数组,C++基础:各种输入方法总结cin.get()、的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 精度问题怎么解决,JavaScr
- 下一篇: c++ 工厂模式_大连中山融雪剂工厂自营