在C語(yǔ)言中g(shù)etchar的使用方法和讀取規(guī)則講解
前言
今天為大家分享getchar在C語(yǔ)言中的使用
一、getchar是什么?
getchar中文意思是獲取字符,getchar函數(shù)從標(biāo)準(zhǔn)輸入輸出里讀取下一個(gè)字符,返回類(lèi)型為int整形,返回用戶(hù)輸入的ASCII碼值,如果到達(dá)文件末尾或者出錯(cuò)返回EOF
二、getchar的使用方法
1.只獲取一次(字符/字符串)的代碼樣例
代碼如下(示例):
#include<stdio.h> int main() { int ch = getchar(); putchar(ch); return 0; }
代碼執(zhí)行結(jié)果
2.循環(huán)獲取(字符/字符串)的代碼樣例
代碼如下(示例):
#include<stdio.h> int main() { int ch = 0; while ((ch = getchar()) != EOF) { putchar(ch); } return 0; }
注意事項(xiàng)
1.這里的EOF并不是輸入EOF循環(huán)結(jié)束
2.EOF的真實(shí)值是-1
3.這里的Ctrl+z的效果便是EOF
代碼執(zhí)行結(jié)果
到這里有些細(xì)心的朋友就會(huì)發(fā)現(xiàn)代碼里面并沒(méi)有換行指令為什么運(yùn)行的結(jié)果會(huì)自動(dòng)換行?
getchardu讀取字符的時(shí)候真的是在鍵盤(pán)上讀取的嗎?
getchar 緩沖區(qū) 鍵盤(pán)
其實(shí)在getchar和鍵盤(pán)之間有個(gè)緩沖區(qū),在緩沖區(qū)是空
的時(shí)候,getchar就會(huì)等待鍵盤(pán)輸入字符,當(dāng)用戶(hù)輸入
A時(shí)其實(shí)多輸入了一個(gè)回車(chē),這是緩沖區(qū)里面就有A\n
getchar首先讀取了A然后輸出,然后又上去讀取了\n
再輸出\n就達(dá)到了換行的效果,所以B會(huì)在第三行輸入
三、getchar的讀取規(guī)則
講了這么多可能很多人都不明白這么一個(gè)代碼有什么用呢?其實(shí)在很多地方都會(huì)用到,比如模擬用戶(hù)登入場(chǎng)景。但是寫(xiě)這個(gè)代碼的時(shí)候就要注意getchar的讀取規(guī)則
代碼如下(示例)
#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)成功"); } else { printf("確認(rèn)失敗"); } return 0; }
代碼運(yùn)行結(jié)果
在這里我們看到都還沒(méi)確認(rèn)就直接輸出確認(rèn)失敗,到這里大家應(yīng)該都明白了是什么問(wèn)題吧?沒(méi)錯(cuò)就是\n的問(wèn)題,這里getchar發(fā)現(xiàn)緩沖區(qū)里面還有一個(gè)\n就沒(méi)等我們輸入直接把\n讀走
那應(yīng)該如何解決呢?
代碼如下(示例)
#include<stdio.h> int main() { char password[20] = { 0 }; printf("請(qǐng)輸入密碼:>"); scanf("%s", password); getchar(); printf("請(qǐng)確認(rèn)密碼(Y/N):>"); int ch = getchar(); if (ch == 'Y') { printf("確認(rèn)成功"); } else { printf("確認(rèn)失敗"); } return 0; }
代碼運(yùn)行結(jié)果
接下來(lái)我們?cè)傧氪蠹宜伎家粋€(gè)問(wèn)題,當(dāng)密碼里面有空格的時(shí)候還會(huì)確認(rèn)成功嗎?
沒(méi)錯(cuò)還是會(huì)失敗,這又是為什么呢?因?yàn)閿?shù)組把空格前面的123456讀走了,但是緩沖區(qū)里還剩下空格abcdef\n所以getchar還是會(huì)讀取緩沖區(qū)里面的東西
那該怎么解決呢?
代碼如下(示例)
int main() { char password[20] = { 0 }; printf("請(qǐng)輸入密碼:>"); scanf("%s", password); int temp = 0; while((temp=getchar())!='\n'); { ; } printf("請(qǐng)確認(rèn)密碼(Y/N):>"); int ch = getchar(); if (ch == 'Y') { printf("確認(rèn)成功"); } else { printf("確認(rèn)失敗"); } return 0; }
代碼運(yùn)行結(jié)果
總結(jié)
從上面我們學(xué)習(xí)到了getchar,發(fā)現(xiàn)其實(shí)getchar的使用很簡(jiǎn)單就是讀取字符,但是難的是它的讀取字符是的規(guī)則,所以我們?cè)谑褂胓etchar的時(shí)候一定要慎重思考它的讀取規(guī)則。
到此這篇關(guān)于在C語(yǔ)言中g(shù)etchar的使用方法和讀取規(guī)則的文章就介紹到這了,更多相關(guān)C語(yǔ)言getchar的使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中memcpy函數(shù)的使用以及模擬實(shí)現(xiàn)
memcpy是c和c++使用的內(nèi)存拷貝函數(shù),本文主要介紹了C++中memcpy函數(shù)的使用以及模擬實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07C++中的函數(shù)指針與函數(shù)對(duì)象的總結(jié)
以下是對(duì)C++中的函數(shù)指針與函數(shù)對(duì)象的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07C++的static關(guān)鍵字及變量存儲(chǔ)位置總結(jié)
今天看博文時(shí),看到了c++的static關(guān)鍵字的一些總結(jié),還涉及到了一些代碼的存儲(chǔ)位置;接下來(lái)為您詳細(xì)呈現(xiàn)2012-11-11VC創(chuàng)建圓角dialog的實(shí)現(xiàn)方法
這篇文章主要介紹了VC創(chuàng)建圓角dialog的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了圓角dialog對(duì)話(huà)框的創(chuàng)建步驟與相關(guān)操作技巧,需要的朋友可以參考下2016-08-08

C++與namespace有關(guān)的兩個(gè)編譯錯(cuò)誤的講解

C語(yǔ)言實(shí)現(xiàn)刪除某一個(gè)數(shù)組值的方法

C++基于遞歸算法解決漢諾塔問(wèn)題與樹(shù)的遍歷功能示例