C語言中g(shù)etchar()與putchar()函數(shù)詳解
getchar()與putchar()getchar()getchar()的一個(gè)重要機(jī)制getchar()與scanf()區(qū)別 putchar() 實(shí)例1.清空緩沖區(qū)2.字符串中有空格
getchar()與putchar()
getchar與putchar其實(shí)最基本的作用就是用getchar讀取一個(gè)字符,再用putchar輸出一個(gè)字符
基本用法:
#include <stdio.h>
int main()
{
char c = 0;
c = getchar();
putchar(c);
return 0;
}
運(yùn)行結(jié)果:

輸入一個(gè)a,然后再打印a
這里getchar和putchar 與scanf和printf的作用基本一致,只不過getchar,putchar只對(duì)字符類型操作,而scanf,printf對(duì)指定的類型進(jìn)行操作
getchar()
getchar的定義:int getchar(void)
- 返回類型是
int值,所以返回的是字符的ASCII碼 - 參數(shù)列表中是
void,所以不必在括號(hào)中傳參數(shù) - 如果
getchar讀取失敗,就會(huì)返回EOF
getchar()的一個(gè)重要機(jī)制
在getchar函數(shù)的作用與鍵盤間,存在一個(gè)輸入緩沖區(qū),從鍵盤輸入的內(nèi)容會(huì)存在這個(gè)緩沖中,接下來getchar函數(shù)會(huì)從緩沖區(qū)中取走內(nèi)容

因?yàn)?code>getchar是對(duì)于字符進(jìn)行操作,所以每次執(zhí)行getchar都會(huì)取走輸入緩沖區(qū)中一個(gè)字符
并且getchar還會(huì)取走回車也就是\n與空格
我們用下面的代碼進(jìn)行對(duì)輸入緩沖區(qū)機(jī)制的測(cè)試:
int main()
{
char ch = 0;
while ((ch = getchar()) != EOF)
{
putchar(ch);
}
return 0;
}
當(dāng)輸入一個(gè)字符a時(shí),同時(shí)我們會(huì)按下回車,此時(shí)輸入緩沖區(qū)中就有兩個(gè)字符:a\n

首先,getchar()會(huì)先取走字符a,然后通過putchar打印出來

接著循環(huán),getchar()取走字符\n,然后通過putchar打印出來,所以在輸出中光標(biāo)不在輸出的a的后面,而在a的下一行

接著,輸入緩沖區(qū)中以無內(nèi)容,getchar()就會(huì)讀到EOF,退出循環(huán)
還可以用以下代碼更進(jìn)一步驗(yàn)證getchar()對(duì)于回車的讀?。?/p>
int main()
{
int i = 0;
char ch = 0;
while ((ch = getchar()) != EOF)
{
putchar(ch);
i++;
}
printf("%d", i);
return 0;
}
輸入字符a和b,這里實(shí)際上是輸入a后,按一次回車,輸入b后,按一次回車,所以輸入緩沖區(qū)中的內(nèi)容為:a\nb\n,所以getchar()會(huì)讀取四次,所以i的值為會(huì)是4

getchar()與scanf()區(qū)別
*getchar與scanf的主要區(qū)別是getchar能讀取輸入緩沖區(qū)中的一切字符類型,包括空格與回車,而scanf()不能讀取空格與回車
putchar()
putchar的定義:
int putchar ( int character );
- 傳的參數(shù)是要輸出的字符變量
putchar的用法與printf("%c",character)一致,都是輸出一個(gè)字符
實(shí)例
1.清空緩沖區(qū)
下面一段把代碼是輸入一段密碼,并且還要用getchar()接受是否確認(rèn)密碼的選項(xiàng):
int main()
{
char password[20] = { 0 };
int ch = 0;
printf("輸入密碼\n");
scanf("%s", password);
printf("請(qǐng)確認(rèn)密碼(Y/N):");
ch = getchar();
if (ch == 'Y')
{
printf("成功\n");
}
else
{
printf("失敗\n");
}
return 0;
}
我們輸入一端密碼后,還未輸入Y或N,代碼就自動(dòng)打印“失敗”并退出運(yùn)行

這其實(shí)還是scamf無法讀取回車在作祟
當(dāng)我們輸入1234567后,此時(shí)在輸入緩沖區(qū)中其實(shí)存的是:1234567\n

scanf("%s", password);語句讀取字符串,因?yàn)樗鼰o法讀取\n所以此時(shí)scanf只會(huì)讀取走1234567,在輸入緩沖區(qū)中還有\n

所以在之后的ch = getchar();中,就會(huì)讀取\n,不等于Y,所以會(huì)打印失敗
所以,要把緩沖中的 \n 消化掉,也就是清空緩沖區(qū)
只要,再寫一個(gè)getchar()語句,將\n讀取走,就可以了
代碼如下:
int main()
{
char password[20] = { 0 };
int ch = 0;
printf("輸入密碼\n");
scanf("%s", password);
printf("請(qǐng)確認(rèn)密碼(Y/N):");
getchar(); //清空緩沖區(qū)
ch = getchar();
if (ch == 'Y')
{
printf("成功\n");
}
else
{
printf("失敗\n");
}
return 0;
}
運(yùn)行成功

2.字符串中有空格
以下代碼是輸入一個(gè)字符串再輸出:
int main()
{
char str[20] = { 0 };
scanf("%s", str);
printf("%s", str);
return 0;
}
如果輸入的字符串是連續(xù)的,也就是沒有空格的,此代碼正常運(yùn)行

如果輸入的字符串是有字符的,就會(huì)出現(xiàn)錯(cuò)誤

錯(cuò)誤的原因還是scanf無法讀取緩沖區(qū)中的空格,所以接下來要使用getchar去讀取字符串
因?yàn)檩斎氲囊欢巫址欢〞?huì)是以\n為結(jié)尾

所以在前面的while ((ch = getchar()) != 'EOF)改成while ((ch = getchar()) != '\n')即可,只要不遇到\n就一直讀取下去
代碼如下:
int main()
{
char str[20] = { 0 };
char ch = 0;
while ((ch = getchar()) != '\n')
{
putchar(ch);
}
return 0;
}
運(yùn)行結(jié)果:


到此這篇關(guān)于C語言中g(shù)etchar()與putchar()函數(shù)詳解的文章就介紹到這了,更多相關(guān)C語言 getchar()與putchar()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

