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

學無先后,達者為師

網站首頁 編程語言 正文

C語言超詳細講解getchar函數的使用_C 語言

作者:野豬佩奇` ? 更新時間: 2022-06-29 編程語言

一、getchar 函數

從上面的介紹來看,我們要正確使用getchar函數,首先得了解什么是緩沖區。

二、緩沖區

1、什么是緩沖區

緩沖區又稱為緩存,它是內存空間的一部分。

也就是說,在內存空間中預留了一定的存儲空間,這些存儲空間用來緩沖輸入或輸出的數據,這部分預留的空間就叫做緩沖區。

緩沖區根據其對應的是輸入設備輸出設備,分為輸入緩沖區和輸出緩沖區。

2、為什么要存在緩沖區

我們為什么要引入緩沖區呢?

比如我們從磁盤里取信息,我們先把讀出的數據放在緩沖區,計算機再直接從緩沖區中取數據,等緩沖區的數據取完后再去磁盤中讀取,這樣就可以減少磁盤的讀寫次數,再加上計算機對緩沖區的操作大大快于對磁盤的操作,故應用緩沖區可大大提高計算機的運行速度。

又比如,我們使用打印機打印文檔,由于打印機的打印速度相對較慢,我們先把文檔輸出到打印機相應的緩沖區,打印機再自行逐步打印,這時我們的CPU可以處理別的事情。現在您基本明白了吧,緩沖區就是一塊內存區,它用在輸入輸出設備和CPU之間,用來緩存數據。它使得低速的輸入輸出設備和高速的CPU能夠協調工作,避免低速的輸入輸出設備占用CPU,解放出CPU,使其能夠高效率工作。

3、緩沖區的類型

緩沖區分為三種類型:全緩沖、行緩沖和不帶緩沖。

1、全緩沖

在這種情況下,當填滿標準I/O緩存后才進行實際I/O操作。全緩沖的典型代表是對磁盤文件的讀寫。

2、行緩沖

在這種情況下,當在輸入和輸出中遇到換行符時,執行真正的I/O操作。這時,我們輸入的字符先存放在緩沖區,等按下回車鍵換行時才進行實際的I/O操作。典型代表是鍵盤輸入數據。

3、不帶緩沖

也就是不進行緩沖,標準出錯情況stderr是典型代表,這使得出錯信息可以直接盡快地顯示出來。

4、緩沖區的刷新

以下四種情況會引發緩沖區刷新:

  • 緩沖區滿時;
  • 執行 flush 語句;
  • 執行 endl 語句;
  • 關閉文件。

三、getchar 函數的正確使用

1、getchar 的換行問題

我們來觀察下面這段代碼

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

我們可以看到我們每次從鍵盤輸入一個字符并回車后,putchar輸出時會自動換行,就是因為我們每次除了輸入字符外,還敲了一個回車,而這個回車會被存儲在緩沖區中,當我們用getchar讀取字符時,會從緩沖區中依次逐個讀取所有的字符(包括換行、空格、Tab),直到緩沖區中沒有數據,每讀取一個字符就用putchar打印一下,所以這里會自動換行。

^Z:Ctrl+Z,輸入后會被認定為EOF,從而來結束循環(VS中有些時候要重復按三次才會結束循環,其他編譯器都是按一次)。

2、getchar 與 scanf 的混合使用

我們來觀察下面這段代碼:

#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;
}

我們可以看到程序并沒有等待我們輸入Y/N來確認密碼,而是直接結束,原因就是我們緩沖區中存放的是abcdef\n,而scanf函數是遇到空格、換行符(\n)、Tab時結束,所以\n并沒有被讀取走,而是繼續留在了緩沖區中,而當getchar讀取數據時發現緩沖區中并不為空,所以直接讀取了\n,然后判斷if條件,結束程序,而不會等待我們輸入Y/N。

那么要如何避免這種情況發生呢?有兩種方法:

法一:在scanf后面加一個getchar(不推薦)

#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;
}

我們在scanf函數后面加上一個getchar函數,用于清空緩沖區里面多余的\n,但是這種方法有弊端,不推薦使用,具體弊端如下:

如圖:我們從鍵盤輸入abcd ef,我們可以看到,程序并沒有等待我們輸入Y/N,而是直接執行if語句,這是因為 scanf函數遇到空格、換行符(\n)、Tab時會停止讀取,所以緩沖區中剩下的字符是_ef\n,一次getchar無法清空緩沖區。所以說,法一只能解決一部分情況,想要徹底解決scanf緩沖區殘留的問題需要用到法二。

法二:在scanf后面加 while( getchar() != ‘\n’) 語句(推薦)

#include<stdio.h>
int main()
{
	char password[20] = { 0 };
	printf("請輸入密碼:>");
	scanf("%s", password);
	getchar();  //讀取剩下的\n
	printf("請確認密碼(Y/N):>");
	while (getchar() != '\n')
	{
		;
	}
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("確認成功\n");
	}
	else
	{
		printf("確認失敗\n");
	}
	return 0;
}

程序中的while( getchar() != ‘\n’)語句會不斷讀取緩沖區中的字符,直到把\n讀取走,從而達到清空緩沖區的目的。

原文鏈接:https://blog.csdn.net/m0_62391199/article/details/124228001

欄目分類
最近更新