目錄
前言
1.getchar()函數(shù)
2.putchar()函數(shù)
3.清空緩沖區(qū)
3.1? ?緩沖區(qū)
3.2? ?場(chǎng)景
3.3? ?問題分析?
3.4? ?改進(jìn)(即清空緩沖區(qū))
前言
C語言的字符輸入函數(shù)getchar和輸出函數(shù)putchar功能介紹,以及緩沖區(qū)的簡(jiǎn)單認(rèn)識(shí)。
1.getchar()函數(shù)
1.int getchar(void)?函數(shù)從屏幕讀取下一個(gè)可用的字符,并把它返回為一個(gè)整數(shù)(返回字符的ASCII碼值)。這個(gè)函數(shù)在同一個(gè)時(shí)間內(nèi)只會(huì)讀取一個(gè)單一的字符。您可以在循環(huán)內(nèi)使用這個(gè)方法,以便從屏幕上讀取多個(gè)字符。
2.讀取失敗or遇到文件末尾是返回EOF。
ch = getchar() 和 scanf("%c", &ch); 語句效果相同
2.putchar()函數(shù)
1.int putchar(int c)?函數(shù)把字符(或者你想返回字符對(duì)應(yīng)的ASCII碼值)輸出到屏幕上,并返回相同的字符。這個(gè)函數(shù)在同一個(gè)時(shí)間內(nèi)只會(huì)輸出一個(gè)單一的字符。您可以在循環(huán)內(nèi)使用這個(gè)方法,以便在屏幕上輸出多個(gè)字符。
putchar(ch) 和 printf("%c", ch); 語句效果相同
3.清空緩沖區(qū)
3.1? ?緩沖區(qū)
1.什么是緩沖區(qū)?
用戶輸入的字符被收集并儲(chǔ)存在一個(gè)被稱為緩沖區(qū)的臨時(shí)存儲(chǔ)區(qū),按下Enter鍵后,程序才可以使用用戶輸入的字符。
2.為什么要有緩沖區(qū)?
首先,把若干字符作為一個(gè)塊進(jìn)行傳輸比逐個(gè)發(fā)送這些字符節(jié)約時(shí)間;
其次,如果用戶打錯(cuò)字符,可以直接通過鍵盤修正錯(cuò)誤,當(dāng)最后按下Enter鍵時(shí),傳輸?shù)氖钦_的輸入。
3.2? ?場(chǎng)景
#include<stdio.h>
int main()
{
char password[20];
printf("請(qǐng)輸入密碼->");
scanf("%s", password); //數(shù)組名不需要使用取地址符&
printf("請(qǐng)確認(rèn)Y/N:");
int ch = getchar();
if ('Y' == ch) {
printf("確認(rèn)成功\n");
}
else {
printf("確認(rèn)失敗\n");
}
return 0;
}
輸出結(jié)果:
3.3? ?問題分析?
1.從輸出結(jié)果我們可以看出:在我們輸入密碼之后,我們并未選擇確認(rèn),程序就直接認(rèn)定我們確認(rèn)失敗。
2.問題原因:scanf 與 getchar 都是從緩沖區(qū)中獲取內(nèi)容,但是關(guān)鍵來了:scanf函數(shù)在我們輸入完畢后按下Enter鍵(或者是空格)后方才停止輸入,此時(shí)scanf中的password拿走了密碼123456,但是后面你敲的回車鍵轉(zhuǎn)變成字符 ' \n ' 被ch = getchar()拿走,也就是說ch = '?\n '肯定不等于' Y ',所以直接輸出確認(rèn)失敗。
3.4? ?改進(jìn)(即清空緩沖區(qū))
1.由3.3分析可知,密碼確認(rèn)的失敗主要是因?yàn)間etchar讀取的? ' \n ' 導(dǎo)致,因此,我們需要清空緩沖區(qū),即scanf讀取后緩沖區(qū)剩余字符我們需要清空。
#include<stdio.h>
int main()
{
char password[20];
printf("請(qǐng)輸入密碼->");
scanf("%s", password); //數(shù)組名不需要使用取地址符&
getchar(); //這里我又加了一個(gè)getchar(),這樣\n就被去掉了
printf("請(qǐng)確認(rèn)Y/N:");
int ch = getchar();
if ('Y' == ch) {
printf("確認(rèn)成功\n");
}
else {
printf("確認(rèn)失敗\n");
}
return 0;
}
2.緩沖區(qū)字符較多,如何清空?
①還是上面的代碼,比如輸入123456? abcd,在6后面我輸入了一個(gè)空格,此時(shí)scanf只讀取到6,則緩沖區(qū)還剩下abcd\n五個(gè)字符,但是getchar()一次只能去除一個(gè),則我們需要通過循環(huán)的方式,逐步去除緩沖區(qū)中所有的剩余字符。
②代碼演示:
#include<stdio.h>
int main()
{
char password[20];
printf("請(qǐng)輸入密碼->");
scanf("%s", password); //數(shù)組名不需要使用取地址符&
int ch = 0;
while (ch = getchar() != '\n') {
;
}
printf("請(qǐng)確認(rèn)Y/N:");
ch = getchar();
if ('Y' == ch) {
printf("確認(rèn)成功\n");
}
else {
printf("確認(rèn)失敗\n");
}
return 0;
}
運(yùn)行結(jié)果:
文章來源:http://www.zghlxwxcb.cn/news/detail-659007.html
這樣我們就達(dá)到了一個(gè)清空緩沖區(qū)的效果!?文章來源地址http://www.zghlxwxcb.cn/news/detail-659007.html
到了這里,關(guān)于C getchar & putchar函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!