C語(yǔ)言中g(shù)etchar的用法以及實(shí)例解析
getchar解析
一、getchar的返回類(lèi)型及作用機(jī)制
getchar——讀取字符的函數(shù)
int getchar(void)
返回類(lèi)型為int,參數(shù)為void.
有人可能會(huì)有疑惑,getchar既然是讀取字符的,為什么返回類(lèi)型是int呢?
1、getchar其實(shí)返回的是字符的ASCII碼值(整數(shù))。
2、getchar在讀取結(jié)束或者失敗的時(shí)候,會(huì)返回EOF。
EOF意思是end of file,本質(zhì)上是-1.
二、根據(jù)一段代碼初步了解
下面我們一起來(lái)看看下面這段代碼什么意思
#include<stdio.h> int main() { int ch = 0; while ((ch = getchar()) != EOF) { putchar(ch); } return 0; }
意思是
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,再按回車(chē)即可。
注意,如果上面的代碼不用while循環(huán)的話,輸入123,putchar()只會(huì)輸出1。因?yàn)橐粋€(gè)getchar一次只能讀取一個(gè)字符。
三、實(shí)例(“輸入密碼”)進(jìn)一步了解
1、代碼達(dá)不到理想效果
我們?cè)賮?lái)看看下面這段代碼
#include<stdio.h> int main() { char password[20] = {0}; printf("請(qǐng)輸入密碼:>"); scanf("%s", password); printf("請(qǐng)確認(rèn)密碼(Y/N):>"); int ch = getchar(); if (ch == 'Y') { printf("確認(rèn)成功\n"); } else { printf("確認(rèn)失敗\n"); } return 0; }
按理說(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ù),它們都是從鍵盤(pán)上來(lái)讀取我們的數(shù)據(jù),但它們不是直接從鍵盤(pán)上來(lái)讀取我們的數(shù)據(jù)。它們和鍵盤(pán)之間有一個(gè)區(qū)域叫緩沖區(qū)。
輸入函數(shù)先來(lái)看緩沖區(qū)中是否有數(shù)據(jù),如果有,它直接就拿走了,不需要從鍵盤(pán)輸入,如果緩沖區(qū)什么都沒(méi)有,則需要從鍵盤(pán)輸入,再拿走。
明白這個(gè)道理后,我們回到上面那串代碼。
最開(kāi)始緩沖區(qū)里沒(méi)有東西,所以我們這行代碼
scanf("%s", password);
就是從鍵盤(pán)輸入密碼,我們輸入123456。為了讓123456放進(jìn)去,我們還敲了一個(gè)回車(chē),所以緩沖區(qū)里為
123456\n
接下來(lái)就是scanf來(lái)讀緩沖區(qū)里的字符串了,scanf讀取的方式是讀取\n之前的內(nèi)容,所以讀取的是123456.printf("請(qǐng)確認(rèn)密碼(Y/N):>");
后,就是下面這行代碼:
int ch = getchar();
getchar用來(lái)接收字符,
getchar看到緩沖區(qū)中有數(shù)據(jù)(\n),直接取走,不需要從鍵盤(pá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>
#include<stdio.h> int main() { char password[20] = {0}; printf("請(qǐng)輸入密碼:>"); scanf("%s", password); getchar();//把緩沖區(qū)中的\n清理掉 printf("請(qǐng)確認(rèn)密碼(Y/N):>"); int ch = getchar(); if (ch == 'Y') { printf("確認(rèn)成功\n"); } else { printf("確認(rèn)失敗\n"); } return 0; }
運(yùn)行一下即可發(fā)現(xiàn),現(xiàn)在能夠得到我們的理想結(jié)果。
2、輸入的密碼中有空格
不過(guò)又有一個(gè)問(wèn)題,當(dāng)我們輸入密碼為123456 789時(shí)(中間有一個(gè)空格),還沒(méi)等我們輸入N或Y,又立馬跳出了“確認(rèn)失敗”。
這又是怎么回事呢?我們一起來(lái)看看
(1)原理詳解
首先緩沖區(qū)里沒(méi)有東西,我們需要通過(guò)鍵盤(pán)輸入密碼123456 789,
然后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。
再往下,就是我們的這行代碼int ch = getchar();
getchar()一來(lái)就取走了緩沖區(qū)中的7,根本不需要我們從鍵盤(pán)輸入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') { ; }
整段代碼如下:
#include<stdio.h> int main() { char password[20] = {0}; printf("請(qǐng)輸入密碼:>"); scanf("%s", password); //把緩沖區(qū)中的內(nèi)容全讀走 while ( getchar() != '\n') { ; } printf("請(qǐng)確認(rèn)密碼(Y/N):>"); int ch = getchar(); if (ch == 'Y') { printf("確認(rèn)成功\n"); } else { printf("確認(rèn)失敗\n"); } return 0; }
運(yùn)行一下
是我們想要的效果。
以上就是關(guān)于getchar的用法的實(shí)例解析。
總結(jié)
到此這篇關(guān)于C語(yǔ)言中g(shù)etchar的用法以及實(shí)例的文章就介紹到這了,更多相關(guān)C語(yǔ)言中g(shù)etchar用法實(shí)例內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++中#include <>與#include""的區(qū)別詳細(xì)解析
<>先去系統(tǒng)目錄中找頭文件,如果沒(méi)有在到當(dāng)前目錄下找。所以像標(biāo)準(zhǔn)的頭文件 stdio.h、stdlib.h等用這個(gè)方法2013-10-10C++11?std::transform函數(shù)使用小結(jié)
std::transform是C++標(biāo)準(zhǔn)庫(kù)中的一個(gè)算法,它用于對(duì)輸入范圍內(nèi)的元素進(jìn)行操作,并將結(jié)果存儲(chǔ)在輸出范圍內(nèi),本文就介紹了std::transform函數(shù)的具體使用,感興趣的可以了解一下2023-09-09C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單通訊錄
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05C++實(shí)現(xiàn)尋找最低公共父節(jié)點(diǎn)的方法
這篇文章主要介紹了C++實(shí)現(xiàn)尋找最低公共父節(jié)點(diǎn)的方法,是數(shù)據(jù)結(jié)構(gòu)中二叉樹(shù)的一個(gè)經(jīng)典算法,有一定的借鑒價(jià)值,需要的朋友可以參考下2014-09-09C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)銀行ATM存取款功能
這個(gè)是大一時(shí)期寫(xiě)的。大四的時(shí)候整理了一下(本人C語(yǔ)言學(xué)的也不太好)??隙ê芏嗖蛔愫痛嬖诼┒吹牡胤健H供借鑒、僅供借鑒,代碼中有大量注釋,新手看起來(lái)也沒(méi)有困難2021-11-11