C語言中g(shù)etchar(?)?函數(shù)使用詳解
一、getchar( ) 函數(shù)定義
getchar()
- 字符輸入函數(shù),沒有參數(shù),從輸入緩沖區(qū)里面讀取一個(gè)字符 - 「 一次只能讀取一個(gè)字符 」EOF
(-1) - end of file 文件結(jié)束標(biāo)志 - 鍵盤上用 ctrl + z 實(shí)現(xiàn)
先查一下文檔
二、函數(shù)返回值
該函數(shù)以無符號 char 強(qiáng)制轉(zhuǎn)換為 int 的形式返回讀取的字符,如果到達(dá)文件末尾或發(fā)生讀取錯(cuò)誤,則返回 EOF(-1)。所以 getchar()
函數(shù)返回值要用 int 整型變量來存儲
#include<stdio.h> int main() { int ch = 0; while ((ch = getchar()) != EOF) { putchar(ch); } return 0; }
運(yùn)行結(jié)果:鍵盤上輸入 abc\n,程序會在屏幕上輸出 abc\n,輸入 def\n,屏幕上會輸出 def\n,當(dāng)按下 ctrl + z 時(shí)程序結(jié)束運(yùn)行
這是為什么呢,程序的運(yùn)行過程是這樣的,getchar 有一個(gè) int 型的返回值。當(dāng)程序調(diào)用 getchar 時(shí),程序就等著用戶按鍵。用戶輸入的字符被存放在鍵盤緩沖區(qū)中,直到用戶按回車為止(回車字符 \n
也放在緩沖區(qū)中),當(dāng)用戶鍵入回車之后,getchar()
函數(shù)才開始從輸入緩沖區(qū)中每次讀取一個(gè)字符,getchar 函數(shù)的返回值是用戶輸入的字符的 ASCII 碼,若遇到文件結(jié)尾 (End-Of-File) 則返回 -1 (EOF),并將用戶輸入的字符回顯到屏幕,如果用戶在按回車之前輸入了不止一個(gè)字符,其他字符會保留在鍵盤緩存區(qū)中,等待后續(xù) getchar 調(diào)用讀取。也就是說,后續(xù)的 getchar 調(diào)用不會等待用戶按鍵,而直接讀取緩沖區(qū)中的字符,直到緩沖區(qū)中的字符讀完后,才等待用戶按鍵。程序中 while 循環(huán)工作時(shí),每一次循環(huán) getchar()
就會從輸入緩沖區(qū)讀取一個(gè)字符,然后 putchar 輸出,直到遇到了文件結(jié)束標(biāo)志 EOF,循環(huán)判斷條件為假,循環(huán)才結(jié)束
為啥用緩沖區(qū)呢?因?yàn)橛?jì)算機(jī)CPU的處理速度是很快的,我們用鍵盤輸入速度比不上CPU的處理速度,CPU就得等鍵盤輸入完,很浪費(fèi)資源,所以,當(dāng)鍵盤輸入完了,讓CPU一次性處理,可以大大提高效率。
參考文章:getchar的使用
三、注意區(qū)分 getchar 和 scanf
對于 scanf
函數(shù),'\n'
會觸發(fā) scanf
讀取輸入緩沖區(qū)的內(nèi)容,但遇到 '\n'
或空格 ' '
會停止讀取,而 getchar
會直接讀取 '\n'
和空格
// scanf多組輸入,s,比如2008 6,使用下面語句,直到遇到'\n',停止讀取 while(scanf("%d", &n) != EOF) { }
四、getchar 的使用實(shí)例
再來看一個(gè)和 getchar()
函數(shù)相關(guān)的實(shí)例:模擬密碼輸入
#include<stdio.h> int main() { char password[20] = { 0 }; //輸入密碼 printf("Input password:"); scanf("%s", password); //確認(rèn)密碼 printf("Comfirm password(Y/N):"); int ch = 0; ch = getchar(); //判斷是否確認(rèn)成功 if (ch == 'Y') { printf("success!\n"); } else { printf("defeat!\n"); } return 0; }
運(yùn)行結(jié)果:
輸入密碼 123456 之后,程序沒有讓我們確認(rèn)密碼,直接判斷確認(rèn)失敗了,為什么會出現(xiàn)這樣的結(jié)果呢?
當(dāng)我們在鍵盤上輸入密碼并按下回車后,鍵盤緩沖區(qū)有 ‘1’ ‘2’ ‘3’ ‘4’ ‘5’ ‘6’ ‘\n’ 這些字符,此時(shí) scanf 函數(shù)開始讀取字符串 ‘1’ ‘2’ ‘3’ ‘4’ ‘5’ ‘6’ ,遇到 ‘\n’ 結(jié)束讀取,這時(shí)運(yùn)行到后面的 getchar 函數(shù)了,getchar 發(fā)現(xiàn)緩沖區(qū)里還有一個(gè) ‘\n’ ,直接將其讀取走并會返回給整型變量 ch,這時(shí)沒有多余的 getchar 函數(shù)來接收字符 ‘Y’ 或者 ‘N’ 了,輪到 if 語句來判斷時(shí),ch 不等于 ‘Y’ ,輸出 defeat!
那我們怎么改進(jìn),讓字符 ‘Y’ 或者 ‘N’ 得以被接收呢,猜你已經(jīng)想到了,那就是在 ch = getchar();
語句前面增加一條 getchar();
語句,來讀取處理掉 ‘\n’ ,這樣用來確認(rèn)密碼的那個(gè) getchar 函數(shù)就可以接收字符 ‘Y’ 或者 ‘N’ 了
繼續(xù)思考,如果我輸入密碼時(shí)多輸了一些無用的字符,又該怎么樣處理掉它們呢?比如輸入 123456 abcdf\n
需要寫一個(gè)循環(huán)來讀取處理掉無用的字符
修改后的代碼如下:
#include<stdio.h> int main() { char password[20] = { 0 }; //輸入密碼 printf("Input password:"); scanf("%s", password); //---清理緩沖區(qū)--- int temp = 0; while ((temp = getchar()) != '\n') { ; } //確認(rèn)密碼 printf("Comfirm password(Y/N):"); int ch = 0; ch = getchar(); //判斷是否確認(rèn)成功 if (ch == 'Y') { printf("success!\n"); } else { printf("defeat!\n"); } return 0; }
運(yùn)行結(jié)果:
到此這篇關(guān)于C語言中g(shù)etchar( ) 函數(shù)詳解的文章就介紹到這了,更多相關(guān)c語言getchar( ) 函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++?基本數(shù)據(jù)類型中int、long等整數(shù)類型取值范圍及原理分析
這篇文章主要介紹了C++?基本數(shù)據(jù)類型中int、long等整數(shù)類型取值范圍及原理分析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11c語言合并兩個(gè)已排序數(shù)組的示例(c語言數(shù)組排序)
如何將兩個(gè)已排序數(shù)組合并成一個(gè)排序數(shù)組,下面我們給出使用c語言合并兩個(gè)已排序數(shù)組的示例,需要的朋友可以參考下2014-03-03C語言實(shí)現(xiàn)隨機(jī)生成6位數(shù)密碼
這篇文章主要為大家詳細(xì)介紹了如何使用C語言實(shí)現(xiàn)一個(gè)簡單而實(shí)用的隨機(jī)密碼生成器,該生成器將生成包含字母、數(shù)字和特殊字符的隨機(jī)密碼,有需要的小伙伴可以參考下2023-11-11