網站首頁 編程語言 正文
前言
今天為大家分享getchar在C語言中的使用
一、getchar是什么?
getchar中文意思是獲取字符,getchar函數從標準輸入輸出里讀取下一個字符,返回類型為int整形,返回用戶輸入的ASCII碼值,如果到達文件末尾或者出錯返回EOF
二、getchar的使用方法
1.只獲取一次(字符/字符串)的代碼樣例
代碼如下(示例):
#include<stdio.h>
int main()
{
int ch = getchar();
putchar(ch);
return 0;
}
代碼執行結果
2.循環獲取(字符/字符串)的代碼樣例
代碼如下(示例):
#include<stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
{
putchar(ch);
}
return 0;
}
注意事項
1.這里的EOF并不是輸入EOF循環結束
2.EOF的真實值是-1
3.這里的Ctrl+z的效果便是EOF
代碼執行結果
到這里有些細心的朋友就會發現代碼里面并沒有換行指令為什么運行的結果會自動換行?
getchardu讀取字符的時候真的是在鍵盤上讀取的嗎?
getchar ? ? ? ? ? ? 緩沖區 ? ? ? ? ? ? ?鍵盤
其實在getchar和鍵盤之間有個緩沖區,在緩沖區是空
的時候,getchar就會等待鍵盤輸入字符,當用戶輸入
A時其實多輸入了一個回車,這是緩沖區里面就有A\n
getchar首先讀取了A然后輸出,然后又上去讀取了\n
再輸出\n就達到了換行的效果,所以B會在第三行輸入
三、getchar的讀取規則
講了這么多可能很多人都不明白這么一個代碼有什么用呢?其實在很多地方都會用到,比如模擬用戶登入場景。但是寫這個代碼的時候就要注意getchar的讀取規則
代碼如下(示例)
#include<stdio.h>
int main()
{
char password[20] = { 0 };
printf("請輸入密碼:>");
scanf("%s", password);
printf("請確認密碼(Y/N):>");
int ch = getchar();
if (ch == 'Y')
{
printf("確認成功");
}
else
{
printf("確認失敗");
}
return 0;
}
代碼運行結果
在這里我們看到都還沒確認就直接輸出確認失敗,到這里大家應該都明白了是什么問題吧?沒錯就是\n的問題,這里getchar發現緩沖區里面還有一個\n就沒等我們輸入直接把\n讀走
那應該如何解決呢?
代碼如下(示例)
#include<stdio.h>
int main()
{
char password[20] = { 0 };
printf("請輸入密碼:>");
scanf("%s", password);
getchar();
printf("請確認密碼(Y/N):>");
int ch = getchar();
if (ch == 'Y')
{
printf("確認成功");
}
else
{
printf("確認失敗");
}
return 0;
}
代碼運行結果
接下來我們再想大家思考一個問題,當密碼里面有空格的時候還會確認成功嗎?
沒錯還是會失敗,這又是為什么呢?因為數組把空格前面的123456讀走了,但是緩沖區里還剩下空格abcdef\n所以getchar還是會讀取緩沖區里面的東西
那該怎么解決呢?
代碼如下(示例)
int main()
{
char password[20] = { 0 };
printf("請輸入密碼:>");
scanf("%s", password);
int temp = 0;
while((temp=getchar())!='\n');
{
;
}
printf("請確認密碼(Y/N):>");
int ch = getchar();
if (ch == 'Y')
{
printf("確認成功");
}
else
{
printf("確認失敗");
}
return 0;
}
代碼運行結果
總結
從上面我們學習到了getchar,發現其實getchar的使用很簡單就是讀取字符,但是難的是它的讀取字符是的規則,所以我們在使用getchar的時候一定要慎重思考它的讀取規則。
原文鏈接:https://blog.csdn.net/m0_67077469/article/details/126073099
相關推薦
- 2022-11-02 Mango?Cache緩存管理庫TinyLFU源碼解析_Golang
- 2022-09-08 Redis?Lua腳本實現ip限流示例_Redis
- 2022-08-04 react使用mobx封裝管理用戶登錄的store示例詳解_React
- 2023-04-19 C++11新特性之四種類型轉換cast說明_C 語言
- 2022-06-08 記一次網站全站http升級為https的過程,websocket : ws升級為wss遇到的問題等
- 2023-07-27 Android啟動優化之布局優化
- 2023-01-28 python基礎之reverse和reversed函數的介紹及使用_python
- 2022-06-02 深入解析Apache?Hudi內核文件標記機制_服務器其它
- 最近更新
-
- 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同步修改后的遠程分支