網站首頁 編程語言 正文
一、getchar( ) 函數定義
getchar()
- 字符輸入函數,沒有參數,從輸入緩沖區里面讀取一個字符 - 「 一次只能讀取一個字符 」EOF
(-1) - end of file 文件結束標志 - 鍵盤上用 ctrl + z 實現
先查一下文檔
二、函數返回值
該函數以無符號 char 強制轉換為 int 的形式返回讀取的字符,如果到達文件末尾或發生讀取錯誤,則返回 EOF(-1)。所以 getchar()
函數返回值要用 int 整型變量來存儲
#include<stdio.h> int main() { int ch = 0; while ((ch = getchar()) != EOF) { putchar(ch); } return 0; }
運行結果:鍵盤上輸入 abc\n,程序會在屏幕上輸出 abc\n,輸入 def\n,屏幕上會輸出 def\n,當按下 ctrl + z 時程序結束運行
這是為什么呢,程序的運行過程是這樣的,getchar 有一個 int 型的返回值。當程序調用 getchar 時,程序就等著用戶按鍵。用戶輸入的字符被存放在鍵盤緩沖區中,直到用戶按回車為止(回車字符 \n
也放在緩沖區中),當用戶鍵入回車之后,getchar()
函數才開始從輸入緩沖區中每次讀取一個字符,getchar 函數的返回值是用戶輸入的字符的 ASCII 碼,若遇到文件結尾 (End-Of-File) 則返回 -1 (EOF),并將用戶輸入的字符回顯到屏幕,如果用戶在按回車之前輸入了不止一個字符,其他字符會保留在鍵盤緩存區中,等待后續 getchar 調用讀取。也就是說,后續的 getchar 調用不會等待用戶按鍵,而直接讀取緩沖區中的字符,直到緩沖區中的字符讀完后,才等待用戶按鍵。程序中 while 循環工作時,每一次循環 getchar()
就會從輸入緩沖區讀取一個字符,然后 putchar 輸出,直到遇到了文件結束標志 EOF,循環判斷條件為假,循環才結束
為啥用緩沖區呢?因為計算機CPU的處理速度是很快的,我們用鍵盤輸入速度比不上CPU的處理速度,CPU就得等鍵盤輸入完,很浪費資源,所以,當鍵盤輸入完了,讓CPU一次性處理,可以大大提高效率。
參考文章:getchar的使用
三、注意區分 getchar 和 scanf
對于 scanf
函數,'\n'
會觸發 scanf
讀取輸入緩沖區的內容,但遇到 '\n'
或空格 ' '
會停止讀取,而 getchar
會直接讀取 '\n'
和空格
// scanf多組輸入,s,比如2008 6,使用下面語句,直到遇到'\n',停止讀取 while(scanf("%d", &n) != EOF) { }
四、getchar 的使用實例
再來看一個和 getchar()
函數相關的實例:模擬密碼輸入
#include<stdio.h> int main() { char password[20] = { 0 }; //輸入密碼 printf("Input password:"); scanf("%s", password); //確認密碼 printf("Comfirm password(Y/N):"); int ch = 0; ch = getchar(); //判斷是否確認成功 if (ch == 'Y') { printf("success!\n"); } else { printf("defeat!\n"); } return 0; }
運行結果:
輸入密碼 123456 之后,程序沒有讓我們確認密碼,直接判斷確認失敗了,為什么會出現這樣的結果呢?
當我們在鍵盤上輸入密碼并按下回車后,鍵盤緩沖區有 ‘1’ ‘2’ ‘3’ ‘4’ ‘5’ ‘6’ ‘\n’ 這些字符,此時 scanf 函數開始讀取字符串 ‘1’ ‘2’ ‘3’ ‘4’ ‘5’ ‘6’ ,遇到 ‘\n’ 結束讀取,這時運行到后面的 getchar 函數了,getchar 發現緩沖區里還有一個 ‘\n’ ,直接將其讀取走并會返回給整型變量 ch,這時沒有多余的 getchar 函數來接收字符 ‘Y’ 或者 ‘N’ 了,輪到 if 語句來判斷時,ch 不等于 ‘Y’ ,輸出 defeat!
那我們怎么改進,讓字符 ‘Y’ 或者 ‘N’ 得以被接收呢,猜你已經想到了,那就是在 ch = getchar();
語句前面增加一條 getchar();
語句,來讀取處理掉 ‘\n’ ,這樣用來確認密碼的那個 getchar 函數就可以接收字符 ‘Y’ 或者 ‘N’ 了
繼續思考,如果我輸入密碼時多輸了一些無用的字符,又該怎么樣處理掉它們呢?比如輸入 123456 abcdf\n
需要寫一個循環來讀取處理掉無用的字符
修改后的代碼如下:
#include<stdio.h> int main() { char password[20] = { 0 }; //輸入密碼 printf("Input password:"); scanf("%s", password); //---清理緩沖區--- int temp = 0; while ((temp = getchar()) != '\n') { ; } //確認密碼 printf("Comfirm password(Y/N):"); int ch = 0; ch = getchar(); //判斷是否確認成功 if (ch == 'Y') { printf("success!\n"); } else { printf("defeat!\n"); } return 0; }
運行結果:
原文鏈接:https://blog.csdn.net/weixin_48025315/article/details/119381482
相關推薦
- 2022-05-08 Entity?Framework根據實體的EntityState狀態實現增刪改查_實用技巧
- 2023-01-11 Selenium中的option使用示例_python
- 2022-08-19 Linux系統文件目錄介紹
- 2022-05-23 Python+OpenCV實現在圖像上繪制矩形_python
- 2022-07-03 pandas選擇或添加列生成新的DataFrame操作示例_python
- 2022-04-20 在Python反編譯中批量pyc轉?py的實現代碼_python
- 2022-03-08 Docker自定義網絡詳細介紹_docker
- 2022-10-18 Python中尋找數據異常值的3種方法_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支