網(wǎng)站首頁 編程語言 正文
一、getchar( ) 函數(shù)定義
getchar()
- 字符輸入函數(shù),沒有參數(shù),從輸入緩沖區(qū)里面讀取一個(gè)字符 - 「 一次只能讀取一個(gè)字符 」EOF
(-1) - end of file 文件結(jié)束標(biāo)志 - 鍵盤上用 ctrl + z 實(shí)現(xiàn)
先查一下文檔
二、函數(shù)返回值
該函數(shù)以無符號(hào) char 強(qiáng)制轉(zhuǎn)換為 int 的形式返回讀取的字符,如果到達(dá)文件末尾或發(fā)生讀取錯(cuò)誤,則返回 EOF(-1)。所以 getchar()
函數(shù)返回值要用 int 整型變量來存儲(chǔ)
#include<stdio.h> int main() { int ch = 0; while ((ch = getchar()) != EOF) { putchar(ch); } return 0; }
運(yùn)行結(jié)果:鍵盤上輸入 abc\n,程序會(huì)在屏幕上輸出 abc\n,輸入 def\n,屏幕上會(huì)輸出 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è)字符,其他字符會(huì)保留在鍵盤緩存區(qū)中,等待后續(xù) getchar 調(diào)用讀取。也就是說,后續(xù)的 getchar 調(diào)用不會(huì)等待用戶按鍵,而直接讀取緩沖區(qū)中的字符,直到緩沖區(qū)中的字符讀完后,才等待用戶按鍵。程序中 while 循環(huán)工作時(shí),每一次循環(huán) getchar()
就會(huì)從輸入緩沖區(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
對(duì)于 scanf
函數(shù),'\n'
會(huì)觸發(fā) scanf
讀取輸入緩沖區(qū)的內(nèi)容,但遇到 '\n'
或空格 ' '
會(huì)停止讀取,而 getchar
會(huì)直接讀取 '\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)失敗了,為什么會(huì)出現(xiàn)這樣的結(jié)果呢?
當(dāng)我們?cè)阪I盤上輸入密碼并按下回車后,鍵盤緩沖區(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’ ,直接將其讀取走并會(huì)返回給整型變量 ch,這時(shí)沒有多余的 getchar 函數(shù)來接收字符 ‘Y’ 或者 ‘N’ 了,輪到 if 語句來判斷時(shí),ch 不等于 ‘Y’ ,輸出 defeat!
那我們?cè)趺锤倪M(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é)果:
原文鏈接:https://blog.csdn.net/weixin_48025315/article/details/119381482
相關(guān)推薦
- 2022-08-26 Python中CSV文件(逗號(hào)分割)實(shí)戰(zhàn)操作指南_python
- 2022-07-02 element下拉框獲取選中的內(nèi)容
- 2023-01-07 Android開發(fā)X?Y軸Board的繪制教程示例_Android
- 2023-01-23 Python操作MongoDB增刪改查代碼示例_python
- 2022-03-19 Linux系統(tǒng)下安裝Redis數(shù)據(jù)庫過程_Redis
- 2022-08-19 關(guān)于springboot項(xiàng)目中引用jquery不生效的問題的解決方案
- 2023-02-06 Python利用Pytorch實(shí)現(xiàn)繪制ROC與PR曲線圖_python
- 2023-02-15 刪除docker中沒有被使用的數(shù)據(jù)卷volume_docker
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支