首頁 > 軟體

C語言中getchar的用法以及範例解析

2022-03-03 13:01:24

getchar解析

一、getchar的返回型別及作用機制

getchar——讀取字元的函數

int getchar(void)

返回型別為int,引數為void.

有人可能會有疑惑,getchar既然是讀取字元的,為什麼返回型別是int呢?

1、getchar其實返回的是字元的ASCII碼值(整數)。

2、getchar在讀取結束或者失敗的時候,會返回EOF。

EOF意思是end of file,本質上是-1.

二、根據一段程式碼初步瞭解

下面我們一起來看看下面這段程式碼什麼意思

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

	return 0;
}

意思是

getchar先讀取一個字元放到ch裡面去,如果這個字元不等於EOF,就進入迴圈,列印這個字元。當getchar讀到檔案末尾或者結束時,它會返回一個EOF,此時結束迴圈。
我們來執行試一下

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

當我們想要結束時,輸入ctrl+Z,再按回車即可。

注意,如果上面的程式碼不用while迴圈的話,輸入123,putchar()只會輸出1。因為一個getchar一次只能讀取一個字元。

三、範例(“輸入密碼”)進一步瞭解

1、程式碼達不到理想效果

我們再來看看下面這段程式碼

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

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

按理說,我們是想要輸入密碼,然後再輸入N或者Y,根據我們輸入的是N還是Y列印“確認成功”或“確認失敗”。

我們來執行一下,看看是否是這樣

可以看到,我們還沒有輸入Y或N,他就立馬跳出來了一個“確認失敗”

為什麼會是這樣呢?

(1)原理詳解

我們來看看它其中的原理:

scanf和getchar都是輸入函數,它們都是從鍵盤上來讀取我們的資料,但它們不是直接從鍵盤上來讀取我們的資料。它們和鍵盤之間有一個區域叫緩衝區

輸入函數先來看緩衝區中是否有資料,如果有,它直接就拿走了,不需要從鍵盤輸入,如果緩衝區什麼都沒有,則需要從鍵盤輸入,再拿走。

明白這個道理後,我們回到上面那串程式碼。

最開始緩衝區裡沒有東西,所以我們這行程式碼

scanf("%s", password);

就是從鍵盤輸入密碼,我們輸入123456。為了讓123456放進去,我們還敲了一個回車,所以緩衝區裡為

123456n

接下來就是scanf來讀緩衝區裡的字串了,scanf讀取的方式是讀取n之前的內容,所以讀取的是123456.
printf("請確認密碼(Y/N):>");後,就是下面這行程式碼:

int ch = getchar();

getchar用來接收字元,

getchar看到緩衝區中有資料(n),直接取走,不需要從鍵盤輸入。自然也就出現了我們上面執行結果的那一幕:還沒輸入N或Y,就立馬跳出“確認失敗”了。

(2)解決措施

那麼我們怎麼解決這個問題呢?

很自然就能想到需要先把緩衝區裡清空

那我們就在前面加一個getchar把緩衝區中的“n”給清理掉。

即程式碼變為

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

執行一下即可發現,現在能夠得到我們的理想結果。

2、輸入的密碼中有空格

不過又有一個問題,當我們輸入密碼為123456 789時(中間有一個空格),還沒等我們輸入N或Y,又立馬跳出了“確認失敗”。
這又是怎麼回事呢?我們一起來看看

(1)原理詳解

首先緩衝區裡沒有東西,我們需要通過鍵盤輸入密碼123456 789,

然後scanf就來取緩衝區中的資料,當它讀到空格的時候,它就不再讀了(這是scanf的一個作用性質)。

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

再往下,執行到getchar();這行程式碼,然而這裡只有一個getchar,它只能讀取一個字元,也就是唯讀了空格,緩衝區中還剩789n。

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

getchar()一來就取走了緩衝區中的7,根本不需要我們從鍵盤輸入N或Y。執行時自然它就自動跳出了“確認錯誤”。

(2)解決措施

所以我們需要把緩衝區中的東西先全部清走

那我們就用一個迴圈,只要沒讀到n,我們就一直用getchar讀

//把緩衝區中的內容全讀走
	while ( getchar() != 'n')
	{
		;
	}

整段程式碼如下:

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

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

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

	return 0;
}

執行一下

是我們想要的效果。

以上就是關於getchar的用法的範例解析。

總結

到此這篇關於C語言中getchar的用法以及範例的文章就介紹到這了,更多相關C語言中getchar用法範例內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com