欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言中g(shù)etchar的用法以及實(shí)例解析

 更新時(shí)間:2022年03月03日 10:43:16   作者:ww?here  
getchar()是stdio.h中的庫(kù)函數(shù),它的作用是從stdin流中讀入一個(gè)字符,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中g(shù)etchar的用法以及實(shí)例的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

getchar解析

一、getchar的返回類(lèi)型及作用機(jī)制

getchar——讀取字符的函數(shù)

int getchar(void)

返回類(lèi)型為int,參數(shù)為void.

有人可能會(huì)有疑惑,getchar既然是讀取字符的,為什么返回類(lèi)型是int呢?

1、getchar其實(shí)返回的是字符的ASCII碼值(整數(shù))。

2、getchar在讀取結(jié)束或者失敗的時(shí)候,會(huì)返回EOF。

EOF意思是end of file,本質(zhì)上是-1.

二、根據(jù)一段代碼初步了解

下面我們一起來(lái)看看下面這段代碼什么意思

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

	return 0;
}

意思是

getchar先讀取一個(gè)字符放到ch里面去,如果這個(gè)字符不等于EOF,就進(jìn)入循環(huán),打印這個(gè)字符。當(dāng)getchar讀到文件末尾或者結(jié)束時(shí),它會(huì)返回一個(gè)EOF,此時(shí)結(jié)束循環(huán)。
我們來(lái)運(yùn)行試一下

輸入A,輸出A;輸入b,輸出b…

當(dāng)我們想要結(jié)束時(shí),輸入ctrl+Z,再按回車(chē)即可。

注意,如果上面的代碼不用while循環(huán)的話,輸入123,putchar()只會(huì)輸出1。因?yàn)橐粋€(gè)getchar一次只能讀取一個(gè)字符。

三、實(shí)例(“輸入密碼”)進(jìn)一步了解

1、代碼達(dá)不到理想效果

我們?cè)賮?lái)看看下面這段代碼

#include<stdio.h>
int main()
{
	char password[20] = {0};
	printf("請(qǐng)輸入密碼:>");
	
	scanf("%s", password);

	printf("請(qǐng)確認(rèn)密碼(Y/N):>");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("確認(rèn)成功\n");
	}
	else
	{
		printf("確認(rèn)失敗\n");
	}
	return 0;
}

按理說(shuō),我們是想要輸入密碼,然后再輸入N或者Y,根據(jù)我們輸入的是N還是Y打印“確認(rèn)成功”或“確認(rèn)失敗”。

我們來(lái)運(yùn)行一下,看看是否是這樣

可以看到,我們還沒(méi)有輸入Y或N,他就立馬跳出來(lái)了一個(gè)“確認(rèn)失敗”

為什么會(huì)是這樣呢?

請(qǐng)?zhí)砑訄D片描述

(1)原理詳解

我們來(lái)看看它其中的原理:

scanf和getchar都是輸入函數(shù),它們都是從鍵盤(pán)上來(lái)讀取我們的數(shù)據(jù),但它們不是直接從鍵盤(pán)上來(lái)讀取我們的數(shù)據(jù)。它們和鍵盤(pán)之間有一個(gè)區(qū)域叫緩沖區(qū)。

輸入函數(shù)先來(lái)看緩沖區(qū)中是否有數(shù)據(jù),如果有,它直接就拿走了,不需要從鍵盤(pán)輸入,如果緩沖區(qū)什么都沒(méi)有,則需要從鍵盤(pán)輸入,再拿走。

明白這個(gè)道理后,我們回到上面那串代碼。

最開(kāi)始緩沖區(qū)里沒(méi)有東西,所以我們這行代碼

scanf("%s", password);

就是從鍵盤(pán)輸入密碼,我們輸入123456。為了讓123456放進(jìn)去,我們還敲了一個(gè)回車(chē),所以緩沖區(qū)里為

123456\n

接下來(lái)就是scanf來(lái)讀緩沖區(qū)里的字符串了,scanf讀取的方式是讀取\n之前的內(nèi)容,所以讀取的是123456.
printf("請(qǐng)確認(rèn)密碼(Y/N):>");后,就是下面這行代碼:

int ch = getchar();

getchar用來(lái)接收字符,

getchar看到緩沖區(qū)中有數(shù)據(jù)(\n),直接取走,不需要從鍵盤(pán)輸入。自然也就出現(xiàn)了我們上面運(yùn)行結(jié)果的那一幕:還沒(méi)輸入N或Y,就立馬跳出“確認(rèn)失敗”了。

(2)解決措施

那么我們?cè)趺唇鉀Q這個(gè)問(wèn)題呢?

很自然就能想到需要先把緩沖區(qū)里清空。

那我們就在前面加一個(gè)getchar把緩沖區(qū)中的“\n”給清理掉。

即代碼變?yōu)?/p>

#include<stdio.h>
int main()
{
	char password[20] = {0};
	printf("請(qǐng)輸入密碼:>");
	scanf("%s", password);
	
	getchar();//把緩沖區(qū)中的\n清理掉
	
	printf("請(qǐng)確認(rèn)密碼(Y/N):>");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("確認(rèn)成功\n");
	}
	else
	{
		printf("確認(rèn)失敗\n");
	}
	return 0;
}

運(yùn)行一下即可發(fā)現(xiàn),現(xiàn)在能夠得到我們的理想結(jié)果。

2、輸入的密碼中有空格

不過(guò)又有一個(gè)問(wèn)題,當(dāng)我們輸入密碼為123456 789時(shí)(中間有一個(gè)空格),還沒(méi)等我們輸入N或Y,又立馬跳出了“確認(rèn)失敗”。
這又是怎么回事呢?我們一起來(lái)看看

(1)原理詳解

首先緩沖區(qū)里沒(méi)有東西,我們需要通過(guò)鍵盤(pán)輸入密碼123456 789,

然后scanf就來(lái)取緩沖區(qū)中的數(shù)據(jù),當(dāng)它讀到空格的時(shí)候,它就不再讀了(這是scanf的一個(gè)作用性質(zhì))。

所以scanf就只取走了123456,而緩沖區(qū)中還剩下(空格) 789\n。

再往下,運(yùn)行到getchar();這行代碼,然而這里只有一個(gè)getchar,它只能讀取一個(gè)字符,也就是只讀了空格,緩沖區(qū)中還剩789\n。

再往下,就是我們的這行代碼int ch = getchar();

getchar()一來(lái)就取走了緩沖區(qū)中的7,根本不需要我們從鍵盤(pán)輸入N或Y。運(yùn)行時(shí)自然它就自動(dòng)跳出了“確認(rèn)錯(cuò)誤”。

(2)解決措施

所以我們需要把緩沖區(qū)中的東西先全部清走

那我們就用一個(gè)循環(huán),只要沒(méi)讀到\n,我們就一直用getchar讀。

//把緩沖區(qū)中的內(nèi)容全讀走
	while ( getchar() != '\n')
	{
		;
	}

整段代碼如下:

#include<stdio.h>
int main()
{
	char password[20] = {0};

	printf("請(qǐng)輸入密碼:>");
	scanf("%s", password);

	//把緩沖區(qū)中的內(nèi)容全讀走
	while ( getchar() != '\n')
	{
		;
	}
	printf("請(qǐng)確認(rèn)密碼(Y/N):>");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("確認(rèn)成功\n");
	}
	else
	{
		printf("確認(rèn)失敗\n");
	}

	return 0;
}

運(yùn)行一下

是我們想要的效果。

以上就是關(guān)于getchar的用法的實(shí)例解析。

總結(jié)

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

相關(guān)文章

  • c++中#include &lt;&gt;與#include""的區(qū)別詳細(xì)解析

    c++中#include &lt;&gt;與#include""的區(qū)別詳細(xì)解析

    <>先去系統(tǒng)目錄中找頭文件,如果沒(méi)有在到當(dāng)前目錄下找。所以像標(biāo)準(zhǔn)的頭文件 stdio.h、stdlib.h等用這個(gè)方法
    2013-10-10
  • 詳解C語(yǔ)言中的Static關(guān)鍵字

    詳解C語(yǔ)言中的Static關(guān)鍵字

    這篇文章主要為大家介紹了C語(yǔ)言中Static關(guān)鍵字,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • C語(yǔ)言制作簡(jiǎn)易金山打字通功能的代碼

    C語(yǔ)言制作簡(jiǎn)易金山打字通功能的代碼

    今天小編就為大家分享一篇關(guān)于C語(yǔ)言制作簡(jiǎn)易金山打字通功能的代碼,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • C++11?std::transform函數(shù)使用小結(jié)

    C++11?std::transform函數(shù)使用小結(jié)

    std::transform是C++標(biāo)準(zhǔn)庫(kù)中的一個(gè)算法,它用于對(duì)輸入范圍內(nèi)的元素進(jìn)行操作,并將結(jié)果存儲(chǔ)在輸出范圍內(nèi),本文就介紹了std::transform函數(shù)的具體使用,感興趣的可以了解一下
    2023-09-09
  • 利用Matlab繪制有趣圖像的示例代碼

    利用Matlab繪制有趣圖像的示例代碼

    這篇文章主要為大家總結(jié)了一些利用Matlab繪制的有趣好看的圖像的示例代碼。文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以動(dòng)手試一試
    2022-03-03
  • C++如何獲取鼠標(biāo)點(diǎn)擊位置

    C++如何獲取鼠標(biāo)點(diǎn)擊位置

    這篇文章主要介紹了C++如何獲取鼠標(biāo)點(diǎn)擊位置問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Qt自定義控件實(shí)現(xiàn)線條型加載條

    Qt自定義控件實(shí)現(xiàn)線條型加載條

    這篇文章主要為大家詳細(xì)介紹了Qt自定義控件實(shí)現(xiàn)線條型加載條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單通訊錄

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單通訊錄

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C++實(shí)現(xiàn)尋找最低公共父節(jié)點(diǎn)的方法

    C++實(shí)現(xiàn)尋找最低公共父節(jié)點(diǎn)的方法

    這篇文章主要介紹了C++實(shí)現(xiàn)尋找最低公共父節(jié)點(diǎn)的方法,是數(shù)據(jù)結(jié)構(gòu)中二叉樹(shù)的一個(gè)經(jīng)典算法,有一定的借鑒價(jià)值,需要的朋友可以參考下
    2014-09-09
  • C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)銀行ATM存取款功能

    C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)銀行ATM存取款功能

    這個(gè)是大一時(shí)期寫(xiě)的。大四的時(shí)候整理了一下(本人C語(yǔ)言學(xué)的也不太好)??隙ê芏嗖蛔愫痛嬖诼┒吹牡胤健H供借鑒、僅供借鑒,代碼中有大量注釋,新手看起來(lái)也沒(méi)有困難
    2021-11-11

最新評(píng)論