最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言中g(shù)etchar(?)?函數(shù)使用詳解

 更新時(shí)間:2022年12月06日 11:36:43   作者:CodeWinter  
getchar()?字符輸入函數(shù),沒有參數(shù),從輸入緩沖區(qū)里面讀取一個(gè)字,需要注意一次只能讀取一個(gè)字符,這篇文章主要介紹了C語(yǔ)言中g(shù)etchar函數(shù)使用詳解,需要的朋友可以參考下

一、getchar( ) 函數(shù)定義

getchar() - 字符輸入函數(shù),沒有參數(shù),從輸入緩沖區(qū)里面讀取一個(gè)字符 - 「 一次只能讀取一個(gè)字符 」
EOF(-1) - end of file 文件結(jié)束標(biāo)志 - 鍵盤上用 ctrl + z 實(shí)現(xiàn)

先查一下文檔

image-20210507174102072

二、函數(shù)返回值

該函數(shù)以無符號(hào) char 強(qiáng)制轉(zhuǎn)換為 int 的形式返回讀取的字符,如果到達(dá)文件末尾或發(fā)生讀取錯(cuò)誤,則返回 EOF(-1)。所以 getchar() 函數(shù)返回值要用 int 整型變量來存儲(chǔ)

#include<stdio.h>
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		putchar(ch);
	}
	return 0;
}

運(yùn)行結(jié)果:鍵盤上輸入 abc\n,程序會(huì)在屏幕上輸出 abc\n,輸入 def\n,屏幕上會(huì)輸出 def\n,當(dāng)按下 ctrl + z 時(shí)程序結(jié)束運(yùn)行

image-20210507171436005

這是為什么呢,程序的運(yùn)行過程是這樣的,getchar 有一個(gè) int 型的返回值。當(dāng)程序調(diào)用 getchar 時(shí),程序就等著用戶按鍵。用戶輸入的字符被存放在鍵盤緩沖區(qū)中,直到用戶按回車為止(回車字符 \n 也放在緩沖區(qū)中),當(dāng)用戶鍵入回車之后,getchar() 函數(shù)才開始從輸入緩沖區(qū)中每次讀取一個(gè)字符,getchar 函數(shù)的返回值是用戶輸入的字符的 ASCII 碼,若遇到文件結(jié)尾 (End-Of-File) 則返回 -1 (EOF),并將用戶輸入的字符回顯到屏幕,如果用戶在按回車之前輸入了不止一個(gè)字符,其他字符會(huì)保留在鍵盤緩存區(qū)中,等待后續(xù) getchar 調(diào)用讀取。也就是說,后續(xù)的 getchar 調(diào)用不會(huì)等待用戶按鍵,而直接讀取緩沖區(qū)中的字符,直到緩沖區(qū)中的字符讀完后,才等待用戶按鍵。程序中 while 循環(huán)工作時(shí),每一次循環(huán) getchar() 就會(huì)從輸入緩沖區(qū)讀取一個(gè)字符,然后 putchar 輸出,直到遇到了文件結(jié)束標(biāo)志 EOF,循環(huán)判斷條件為假,循環(huán)才結(jié)束

為啥用緩沖區(qū)呢?因?yàn)橛?jì)算機(jī)CPU的處理速度是很快的,我們用鍵盤輸入速度比不上CPU的處理速度,CPU就得等鍵盤輸入完,很浪費(fèi)資源,所以,當(dāng)鍵盤輸入完了,讓CPU一次性處理,可以大大提高效率。

參考文章:getchar的使用

三、注意區(qū)分 getchar 和 scanf

對(duì)于 scanf 函數(shù),'\n' 會(huì)觸發(fā) scanf 讀取輸入緩沖區(qū)的內(nèi)容,但遇到 '\n' 或空格 ' ' 會(huì)停止讀取,而 getchar 會(huì)直接讀取 '\n' 和空格

// scanf多組輸入,s,比如2008 6,使用下面語(yǔ)句,直到遇到'\n',停止讀取
while(scanf("%d", &n) != EOF) { }

四、getchar 的使用實(shí)例

再來看一個(gè)和 getchar() 函數(shù)相關(guān)的實(shí)例:模擬密碼輸入

#include<stdio.h>
int main()
{
	char password[20] = { 0 };
	//輸入密碼
	printf("Input password:");
	scanf("%s", password);
	//確認(rèn)密碼
	printf("Comfirm password(Y/N):");
	int ch = 0;
	ch = getchar();
	//判斷是否確認(rèn)成功
	if (ch == 'Y')
	{
		printf("success!\n");
	}
	else
	{
		printf("defeat!\n");
	}
	return 0;
}

運(yùn)行結(jié)果:

image-20210508223724390

輸入密碼 123456 之后,程序沒有讓我們確認(rèn)密碼,直接判斷確認(rèn)失敗了,為什么會(huì)出現(xiàn)這樣的結(jié)果呢?

當(dāng)我們?cè)阪I盤上輸入密碼并按下回車后,鍵盤緩沖區(qū)有 ‘1’ ‘2’ ‘3’ ‘4’ ‘5’ ‘6’ ‘\n’ 這些字符,此時(shí) scanf 函數(shù)開始讀取字符串 ‘1’ ‘2’ ‘3’ ‘4’ ‘5’ ‘6’ ,遇到 ‘\n’ 結(jié)束讀取,這時(shí)運(yùn)行到后面的 getchar 函數(shù)了,getchar 發(fā)現(xiàn)緩沖區(qū)里還有一個(gè) ‘\n’ ,直接將其讀取走并會(huì)返回給整型變量 ch,這時(shí)沒有多余的 getchar 函數(shù)來接收字符 ‘Y’ 或者 ‘N’ 了,輪到 if 語(yǔ)句來判斷時(shí),ch 不等于 ‘Y’ ,輸出 defeat!

那我們?cè)趺锤倪M(jìn),讓字符 ‘Y’ 或者 ‘N’ 得以被接收呢,猜你已經(jīng)想到了,那就是在 ch = getchar(); 語(yǔ)句前面增加一條 getchar(); 語(yǔ)句,來讀取處理掉 ‘\n’ ,這樣用來確認(rèn)密碼的那個(gè) getchar 函數(shù)就可以接收字符 ‘Y’ 或者 ‘N’ 了

繼續(xù)思考,如果我輸入密碼時(shí)多輸了一些無用的字符,又該怎么樣處理掉它們呢?比如輸入 123456 abcdf\n

image-20210508230348909

需要寫一個(gè)循環(huán)來讀取處理掉無用的字符

修改后的代碼如下:

#include<stdio.h>
int main()
{
	char password[20] = { 0 };
	//輸入密碼
	printf("Input password:");
	scanf("%s", password);
    //---清理緩沖區(qū)---
	int temp = 0;
	while ((temp = getchar()) != '\n')
	{
		;
	}
	//確認(rèn)密碼
	printf("Comfirm password(Y/N):");
	int ch = 0;
	ch = getchar();
	//判斷是否確認(rèn)成功
	if (ch == 'Y')
	{
		printf("success!\n");
	}
	else
	{
		printf("defeat!\n");
	}
	return 0;
}

運(yùn)行結(jié)果:

image-20210508233110722

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

相關(guān)文章

最新評(píng)論

中超| 金坛市| 定边县| 洛扎县| 当涂县| 金山区| 兰州市| 乐至县| 河津市| 和平县| 泰兴市| 鸡泽县| 崇义县| 凤阳县| 阿拉尔市| 黑山县| 库车县| 平果县| 东台市| 竹山县| 兴和县| 海伦市| 定远县| 咸宁市| 琼中| 林州市| 页游| 许昌县| 临潭县| 通河县| 南宁市| 荃湾区| 三门县| 巧家县| 文山县| 泽库县| 曲松县| 囊谦县| 阳信县| 贵州省| 庄浪县|