




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C語(yǔ)言中g(shù)etchar的用法以及實(shí)例解析目錄getchar解析一、getchar的返回類型及作用機(jī)制二、根據(jù)一段代碼初步了解三、實(shí)例(輸入密碼)進(jìn)一步了解1、代碼達(dá)不到理想效果2、輸入的密碼中有空格總結(jié)
getchar解析
一、getchar的返回類型及作用機(jī)制
getchar讀取字符的函數(shù)
intgetchar(void)
返回類型為int,參數(shù)為void.
有人可能會(huì)有疑惑,getchar既然是讀取字符的,為什么返回類型是int呢?
1、getchar其實(shí)返回的是字符的ASCII碼值(整數(shù))。
2、getchar在讀取結(jié)束或者失敗的時(shí)候,會(huì)返回EOF。
EOF意思是endoffile,本質(zhì)上是-1.
二、根據(jù)一段代碼初步了解
下面我們一起來(lái)看看下面這段代碼什么意思
#includestdio.h
intmain()
intch=0;
while((ch=getchar())!=EOF)
putchar(ch);
return0;
意思是
getchar先讀取一個(gè)字符放到ch里面去,如果這個(gè)字符不等于EOF,就進(jìn)入循環(huán),打印這個(gè)字符。當(dāng)getchar讀到文件末尾或者結(jié)束時(shí),它會(huì)返回一個(gè)EOF,此時(shí)結(jié)束循環(huán)。
我們來(lái)運(yùn)行試一下
輸入A,輸出A;輸入b,輸出b
當(dāng)我們想要結(jié)束時(shí),輸入ctrl+Z,再按回車即可。
注意,如果上面的代碼不用while循環(huán)的話,輸入123,putchar()只會(huì)輸出1。因?yàn)橐粋€(gè)getchar一次只能讀取一個(gè)字符。
三、實(shí)例(輸入密碼)進(jìn)一步了解
1、代碼達(dá)不到理想效果
我們?cè)賮?lái)看看下面這段代碼
#includestdio.h
intmain()
charpassword[20]={0};
printf("請(qǐng)輸入密碼:
scanf("%s",password);
printf("請(qǐng)確認(rèn)密碼(Y/N):
intch=getchar();
if(ch=='Y')
printf("確認(rèn)成功\n");
else
printf("確認(rèn)失敗\n");
return0;
按理說(shuō),我們是想要輸入密碼,然后再輸入N或者Y,根據(jù)我們輸入的是N還是Y打印確認(rèn)成功或確認(rèn)失敗。
我們來(lái)運(yùn)行一下,看看是否是這樣
可以看到,我們還沒(méi)有輸入Y或N,他就立馬跳出來(lái)了一個(gè)確認(rèn)失敗
為什么會(huì)是這樣呢?
(1)原理詳解
我們來(lái)看看它其中的原理:
scanf和getchar都是輸入函數(shù),它們都是從鍵盤上來(lái)讀取我們的數(shù)據(jù),但它們不是直接從鍵盤上來(lái)讀取我們的數(shù)據(jù)。它們和鍵盤之間有一個(gè)區(qū)域叫緩沖區(qū)。
輸入函數(shù)先來(lái)看緩沖區(qū)中是否有數(shù)據(jù),如果有,它直接就拿走了,不需要從鍵盤輸入,如果緩沖區(qū)什么都沒(méi)有,則需要從鍵盤輸入,再拿走。
明白這個(gè)道理后,我們回到上面那串代碼。
最開(kāi)始緩沖區(qū)里沒(méi)有東西,所以我們這行代碼
scanf(%s,password);
就是從鍵盤輸入密碼,我們輸入123456。為了讓123456放進(jìn)去,我們還敲了一個(gè)回車,所以緩沖區(qū)里為
123456\n
接下來(lái)就是scanf來(lái)讀緩沖區(qū)里的字符串了,scanf讀取的方式是讀取\n之前的內(nèi)容,所以讀取的是123456.
printf(請(qǐng)確認(rèn)密碼(Y/N):后,就是下面這行代碼:
intch=getchar();
getchar用來(lái)接收字符,
getchar看到緩沖區(qū)中有數(shù)據(jù)(\n),直接取走,不需要從鍵盤輸入。自然也就出現(xiàn)了我們上面運(yùn)行結(jié)果的那一幕:還沒(méi)輸入N或Y,就立馬跳出確認(rèn)失敗了。
(2)解決措施
那么我們?cè)趺唇鉀Q這個(gè)問(wèn)題呢?
很自然就能想到需要先把緩沖區(qū)里清空。
那我們就在前面加一個(gè)getchar把緩沖區(qū)中的\n給清理掉。
即代碼變?yōu)?/p>
#includestdio.h
intmain()
charpassword[20]={0};
printf("請(qǐng)輸入密碼:
scanf("%s",password);
getchar();//把緩沖區(qū)中的\n清理掉
printf("請(qǐng)確認(rèn)密碼(Y/N):
intch=getchar();
if(ch=='Y')
printf("確認(rèn)成功\n");
else
printf("確認(rèn)失敗\n");
return0;
運(yùn)行一下即可發(fā)現(xiàn),現(xiàn)在能夠得到我們的理想結(jié)果。
2、輸入的密碼中有空格
不過(guò)又有一個(gè)問(wèn)題,當(dāng)我們輸入密碼為123456789時(shí)(中間有一個(gè)空格),還沒(méi)等我們輸入N或Y,又立馬跳出了確認(rèn)失敗。
這又是怎么回事呢?我們一起來(lái)看看
(1)原理詳解
首先緩沖區(qū)里沒(méi)有東西,我們需要通過(guò)鍵盤輸入密碼123456789,
然后scanf就來(lái)取緩沖區(qū)中的數(shù)據(jù),當(dāng)它讀到空格的時(shí)候,它就不再讀了(這是scanf的一個(gè)作用性質(zhì))。
所以scanf就只取走了123456,而緩沖區(qū)中還剩下(空格)789\n。
再往下,運(yùn)行到getchar();這行代碼,然而這里只有一個(gè)getchar,它只能讀取一個(gè)字符,也就是只讀了空格,緩沖區(qū)中還剩789\n。
再往下,就是我們的這行代碼intch=getchar();
getchar()一來(lái)就取走了緩沖區(qū)中的7,根本不需要我們從鍵盤輸入N或Y。運(yùn)行時(shí)自然它就自動(dòng)跳出了確認(rèn)錯(cuò)誤。
(2)解決措施
所以我們需要把緩沖區(qū)中的東西先全部清走。
那我們就用一個(gè)循環(huán),只要沒(méi)讀到\n,我們就一直用getchar讀。
即
//把緩沖區(qū)中的內(nèi)容全讀走
while(getchar()!='\n')
整段代碼如下:
#includestdio.h
intmain()
charpassword[20]={0};
printf("請(qǐng)輸入密碼:
scanf("%s",password);
//把緩沖區(qū)中的內(nèi)容全讀走
while(getchar()!='\n')
printf("請(qǐng)確認(rèn)密碼(Y/N):
intch=getcha
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 書(shū)寫食堂承包合同范例
- 會(huì)計(jì)實(shí)務(wù)中的風(fēng)險(xiǎn)分析與控制方法題目解析試題及答案
- 中級(jí)會(huì)計(jì)知識(shí)點(diǎn)試題及答案
- 買賣獨(dú)立車庫(kù)合同范例
- 如何高效復(fù)習(xí)二級(jí)消防工程師試題及答案
- 企業(yè)購(gòu)買電腦合同范例
- 公墓項(xiàng)目代理合同范例
- 2025年考試復(fù)習(xí)計(jì)劃框架試題及答案
- 14總包合同范例
- 22025年護(hù)師試題創(chuàng)意及答案解析
- 國(guó)開(kāi)(天津)基層安全與教育策劃與實(shí)施形考1-2試題及答案
- 2024年下半年教師資格考試初中思想品德面試試題及解答
- 【《長(zhǎng)虹美菱基于EVA的業(yè)績(jī)?cè)u(píng)價(jià)的案例分析》9800字】
- 2024年03月安徽合肥市第二人民醫(yī)院招考聘用工作人員79人筆試近年2018-2023典型考題及考點(diǎn)剖析附答案帶詳解
- 【N600MW發(fā)電機(jī)組改供熱探析17000字(論文)】
- 【應(yīng)收賬款管理問(wèn)題及完善策略:以S建工集團(tuán)公司為例9800字(論文)】
- 2024綠色工業(yè)園區(qū)評(píng)價(jià)通則
- DL-T5372-2017水電水利工程金屬結(jié)構(gòu)與機(jī)電設(shè)備安裝安全技術(shù)規(guī)程
- 人教版數(shù)學(xué)《認(rèn)識(shí)鐘表》公開(kāi)課課件1
- Pep 新版小學(xué)英語(yǔ)六年級(jí)下冊(cè)一般過(guò)去時(shí)復(fù)習(xí)課教案
- 產(chǎn)科10個(gè)臨床路徑
評(píng)論
0/150
提交評(píng)論