日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言中getchar(?)?函數使用詳解_C 語言

作者:CodeWinter ? 更新時間: 2023-01-02 編程語言

一、getchar( ) 函數定義

getchar() - 字符輸入函數,沒有參數,從輸入緩沖區里面讀取一個字符 - 「 一次只能讀取一個字符 」
EOF(-1) - end of file 文件結束標志 - 鍵盤上用 ctrl + z 實現

先查一下文檔

image-20210507174102072

二、函數返回值

該函數以無符號 char 強制轉換為 int 的形式返回讀取的字符,如果到達文件末尾或發生讀取錯誤,則返回 EOF(-1)。所以 getchar() 函數返回值要用 int 整型變量來存儲

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

運行結果:鍵盤上輸入 abc\n,程序會在屏幕上輸出 abc\n,輸入 def\n,屏幕上會輸出 def\n,當按下 ctrl + z 時程序結束運行

image-20210507171436005

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

為啥用緩沖區呢?因為計算機CPU的處理速度是很快的,我們用鍵盤輸入速度比不上CPU的處理速度,CPU就得等鍵盤輸入完,很浪費資源,所以,當鍵盤輸入完了,讓CPU一次性處理,可以大大提高效率。

參考文章:getchar的使用

三、注意區分 getchar 和 scanf

對于 scanf 函數,'\n' 會觸發 scanf 讀取輸入緩沖區的內容,但遇到 '\n' 或空格 ' ' 會停止讀取,而 getchar 會直接讀取 '\n' 和空格

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

四、getchar 的使用實例

再來看一個和 getchar() 函數相關的實例:模擬密碼輸入

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

運行結果:

image-20210508223724390

輸入密碼 123456 之后,程序沒有讓我們確認密碼,直接判斷確認失敗了,為什么會出現這樣的結果呢?

當我們在鍵盤上輸入密碼并按下回車后,鍵盤緩沖區有 ‘1’ ‘2’ ‘3’ ‘4’ ‘5’ ‘6’ ‘\n’ 這些字符,此時 scanf 函數開始讀取字符串 ‘1’ ‘2’ ‘3’ ‘4’ ‘5’ ‘6’ ,遇到 ‘\n’ 結束讀取,這時運行到后面的 getchar 函數了,getchar 發現緩沖區里還有一個 ‘\n’ ,直接將其讀取走并會返回給整型變量 ch,這時沒有多余的 getchar 函數來接收字符 ‘Y’ 或者 ‘N’ 了,輪到 if 語句來判斷時,ch 不等于 ‘Y’ ,輸出 defeat!

那我們怎么改進,讓字符 ‘Y’ 或者 ‘N’ 得以被接收呢,猜你已經想到了,那就是在 ch = getchar(); 語句前面增加一條 getchar(); 語句,來讀取處理掉 ‘\n’ ,這樣用來確認密碼的那個 getchar 函數就可以接收字符 ‘Y’ 或者 ‘N’ 了

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

image-20210508230348909

需要寫一個循環來讀取處理掉無用的字符

修改后的代碼如下:

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

運行結果:

image-20210508233110722

原文鏈接:https://blog.csdn.net/weixin_48025315/article/details/119381482

欄目分類
最近更新