C++中putchar與getchar函數(shù)的細(xì)節(jié)及運(yùn)用
在C語(yǔ)言中,輸入和輸出除了用printf和scanf外,另外還有用于輸入字符的函數(shù)為getchar()函數(shù),用于輸出字符的函數(shù)為putchar()函數(shù)。
功能解釋如下:


下面用例子來(lái)說(shuō)明函數(shù)的用法
#include <stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
結(jié)果:

可以看出,當(dāng)按下鍵盤(pán)上的回車鍵時(shí),getchar函數(shù)會(huì)讀取到屏幕中輸入的字符和回車字符'\n',而putchar函數(shù)會(huì)將這個(gè)字符再次打印在屏幕上并顯示出回車的效果。而當(dāng)按下鍵盤(pán)上的ctrl+z鍵的時(shí)候,就會(huì)讓getchar讀取到EOF(意味著讀取字符失敗),此時(shí)getchar就會(huì)讀取結(jié)束。
應(yīng)用:
#include <stdio.h>
int main()
{
char password[20] = { 0 };
printf("請(qǐng)輸入密碼:>\n");
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;
}

整體上看并沒(méi)有什么語(yǔ)法上的錯(cuò)誤,但為什么會(huì)出現(xiàn)上面的情況呢?這里就要重點(diǎn)說(shuō)明一下getchar函數(shù)的讀取細(xì)節(jié)了。
如圖:

首先scanf會(huì)把空格前的字符(即“12345”)都獲取,此時(shí)緩沖區(qū)中就會(huì)剩下“ (空格)avcde”,而getchar函數(shù)就會(huì)將剩下的第一個(gè)字符讀取,讀取的第一個(gè)位“(空格)”,不為“Y”,所以顯示“確認(rèn)失敗”;如何解決這一問(wèn)題呢?就需要將剩下的字符都獲取完(包括“\n”,原因是當(dāng)在鍵盤(pán)上按下回車鍵時(shí),系統(tǒng)就會(huì)默認(rèn)輸入一個(gè)“\n”),再輸入后才會(huì)讀取成功。
改進(jìn)如下:
char password[20] = { 0 };
printf("請(qǐng)輸入密碼:>\n");
scanf("%s", password);
printf("請(qǐng)確認(rèn)密碼<Y/N>:");
int tmp = 0;
//巧妙的運(yùn)用循環(huán)來(lái)清理緩沖區(qū)內(nèi)的多個(gè)字符
while ((tmp = getchar()) != '\n')//當(dāng)獲取到'\n'時(shí),循環(huán)結(jié)束
{
;
}
int ch = getchar();
if (ch == 'Y')
{
printf("確認(rèn)成功!");
}
else
{
printf("確認(rèn)失?。?);
}

此時(shí)就能按照正常的邏輯運(yùn)行了。
以上就是對(duì)getchar函數(shù)一些小細(xì)節(jié)的理解,如有不當(dāng),歡迎指正!
到此這篇關(guān)于C++中putchar與getchar函數(shù)的細(xì)節(jié)及運(yùn)用的文章就介紹到這了,更多相關(guān)putchar與getchar函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)BMP圖像閉運(yùn)算處理
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)BMP圖像閉運(yùn)算處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
C++實(shí)現(xiàn)路口交通燈模擬系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)路口交通燈模擬系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
6個(gè)變態(tài)的C語(yǔ)言Hello World程序
這篇文章主要介紹了6個(gè)變態(tài)的C語(yǔ)言Hello World程序,需要的朋友可以參考下2016-05-05
OpenSSL使用AES實(shí)現(xiàn)文件加解密功能
AES是一種對(duì)稱加密算法,它是目前廣泛使用的加密算法之一,意味著加密和解密使用相同的密鑰,這就要求密鑰的安全性非常重要,因?yàn)槿魏螕碛忻荑€的人都能進(jìn)行加密和解密操作,本文給大家介紹了OpenSSL如何使用AES實(shí)現(xiàn)文件加解密功能,需要的朋友可以參考下2023-11-11
C語(yǔ)言實(shí)現(xiàn)循環(huán)隊(duì)列基本操作
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)循環(huán)隊(duì)列基本操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09

