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

C語(yǔ)言超詳細(xì)講解getchar函數(shù)的使用

 更新時(shí)間:2022年05月05日 16:29:03   作者:野豬佩奇`  
C 庫(kù)函數(shù) int getchar(void) 從標(biāo)準(zhǔn)輸入 stdin 獲取一個(gè)字符(一個(gè)無(wú)符號(hào)字符)。這等同于 getc 帶有 stdin 作為參數(shù),下面讓我們?cè)敿?xì)來(lái)看看

一、getchar 函數(shù)

從上面的介紹來(lái)看,我們要正確使用getchar函數(shù),首先得了解什么是緩沖區(qū)。

二、緩沖區(qū)

1、什么是緩沖區(qū)

緩沖區(qū)又稱為緩存,它是內(nèi)存空間的一部分。

也就是說(shuō),在內(nèi)存空間中預(yù)留了一定的存儲(chǔ)空間,這些存儲(chǔ)空間用來(lái)緩沖輸入或輸出的數(shù)據(jù),這部分預(yù)留的空間就叫做緩沖區(qū)。

緩沖區(qū)根據(jù)其對(duì)應(yīng)的是輸入設(shè)備輸出設(shè)備,分為輸入緩沖區(qū)和輸出緩沖區(qū)。

2、為什么要存在緩沖區(qū)

我們?yōu)槭裁匆刖彌_區(qū)呢?

比如我們從磁盤(pán)里取信息,我們先把讀出的數(shù)據(jù)放在緩沖區(qū),計(jì)算機(jī)再直接從緩沖區(qū)中取數(shù)據(jù),等緩沖區(qū)的數(shù)據(jù)取完后再去磁盤(pán)中讀取,這樣就可以減少磁盤(pán)的讀寫(xiě)次數(shù),再加上計(jì)算機(jī)對(duì)緩沖區(qū)的操作大大快于對(duì)磁盤(pán)的操作,故應(yīng)用緩沖區(qū)可大大提高計(jì)算機(jī)的運(yùn)行速度。

又比如,我們使用打印機(jī)打印文檔,由于打印機(jī)的打印速度相對(duì)較慢,我們先把文檔輸出到打印機(jī)相應(yīng)的緩沖區(qū),打印機(jī)再自行逐步打印,這時(shí)我們的CPU可以處理別的事情?,F(xiàn)在您基本明白了吧,緩沖區(qū)就是一塊內(nèi)存區(qū),它用在輸入輸出設(shè)備和CPU之間,用來(lái)緩存數(shù)據(jù)。它使得低速的輸入輸出設(shè)備和高速的CPU能夠協(xié)調(diào)工作,避免低速的輸入輸出設(shè)備占用CPU,解放出CPU,使其能夠高效率工作。

3、緩沖區(qū)的類型

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

1、全緩沖

在這種情況下,當(dāng)填滿標(biāo)準(zhǔn)I/O緩存后才進(jìn)行實(shí)際I/O操作。全緩沖的典型代表是對(duì)磁盤(pán)文件的讀寫(xiě)。

2、行緩沖

在這種情況下,當(dāng)在輸入和輸出中遇到換行符時(shí),執(zhí)行真正的I/O操作。這時(shí),我們輸入的字符先存放在緩沖區(qū),等按下回車鍵換行時(shí)才進(jìn)行實(shí)際的I/O操作。典型代表是鍵盤(pán)輸入數(shù)據(jù)。

3、不帶緩沖

也就是不進(jìn)行緩沖,標(biāo)準(zhǔn)出錯(cuò)情況stderr是典型代表,這使得出錯(cuò)信息可以直接盡快地顯示出來(lái)。

4、緩沖區(qū)的刷新

以下四種情況會(huì)引發(fā)緩沖區(qū)刷新:

  • 緩沖區(qū)滿時(shí);
  • 執(zhí)行 flush 語(yǔ)句;
  • 執(zhí)行 endl 語(yǔ)句;
  • 關(guān)閉文件。

三、getchar 函數(shù)的正確使用

1、getchar 的換行問(wèn)題

我們來(lái)觀察下面這段代碼

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

我們可以看到我們每次從鍵盤(pán)輸入一個(gè)字符并回車后,putchar輸出時(shí)會(huì)自動(dòng)換行,就是因?yàn)槲覀兠看纬溯斎胱址?,還敲了一個(gè)回車,而這個(gè)回車會(huì)被存儲(chǔ)在緩沖區(qū)中,當(dāng)我們用getchar讀取字符時(shí),會(huì)從緩沖區(qū)中依次逐個(gè)讀取所有的字符(包括換行、空格、Tab),直到緩沖區(qū)中沒(méi)有數(shù)據(jù),每讀取一個(gè)字符就用putchar打印一下,所以這里會(huì)自動(dòng)換行。

^Z:Ctrl+Z,輸入后會(huì)被認(rèn)定為EOF,從而來(lái)結(jié)束循環(huán)(VS中有些時(shí)候要重復(fù)按三次才會(huì)結(jié)束循環(huán),其他編譯器都是按一次)。

2、getchar 與 scanf 的混合使用

我們來(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;
}

我們可以看到程序并沒(méi)有等待我們輸入Y/N來(lái)確認(rèn)密碼,而是直接結(jié)束,原因就是我們緩沖區(qū)中存放的是abcdef\n,而scanf函數(shù)是遇到空格、換行符(\n)、Tab時(shí)結(jié)束,所以\n并沒(méi)有被讀取走,而是繼續(xù)留在了緩沖區(qū)中,而當(dāng)getchar讀取數(shù)據(jù)時(shí)發(fā)現(xiàn)緩沖區(qū)中并不為空,所以直接讀取了\n,然后判斷if條件,結(jié)束程序,而不會(huì)等待我們輸入Y/N。

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

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

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

我們?cè)趕canf函數(shù)后面加上一個(gè)getchar函數(shù),用于清空緩沖區(qū)里面多余的\n,但是這種方法有弊端,不推薦使用,具體弊端如下:

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

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

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

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

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

相關(guān)文章

  • C++數(shù)據(jù)結(jié)構(gòu)紅黑樹(shù)全面分析

    C++數(shù)據(jù)結(jié)構(gòu)紅黑樹(shù)全面分析

    今天的這一篇博客,我要跟大家介紹二叉搜索樹(shù)中的另一顆樹(shù)——紅黑樹(shù),它主要是通過(guò)控制顏色來(lái)控制自身的平衡,但它的平衡沒(méi)有AVL樹(shù)的平衡那么嚴(yán)格
    2022-02-02
  • C/C++ 常用排序算法整理匯總分享

    C/C++ 常用排序算法整理匯總分享

    排序算法,就是如何使得記錄按照要求排列的方法。排序算法在很多領(lǐng)域得到相當(dāng)?shù)刂匾?,尤其是在大量?shù)據(jù)的處理方面。一個(gè)優(yōu)秀的算法可以節(jié)省大量的資源。本篇整理了c語(yǔ)言和c++的常用的排序算法,感興趣的朋友可以參考下
    2021-06-06
  • C++ 中二分查找遞歸非遞歸實(shí)現(xiàn)并分析

    C++ 中二分查找遞歸非遞歸實(shí)現(xiàn)并分析

    這篇文章主要介紹了C++ 中二分查找遞歸非遞歸實(shí)現(xiàn)并分析的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C語(yǔ)言解決青蛙跳臺(tái)階問(wèn)題(升級(jí)版)

    C語(yǔ)言解決青蛙跳臺(tái)階問(wèn)題(升級(jí)版)

    所謂的青蛙跳臺(tái)階問(wèn)題,就是指一只青蛙一次可以跳上1級(jí)臺(tái)階,也可以跳上2級(jí)。求該青蛙跳上一個(gè)n級(jí)的臺(tái)階總共有多少種跳法。本文將用C語(yǔ)言解決這一問(wèn)題,需要的可以參考一下
    2022-01-01
  • C++中訪問(wèn)字符串的三種方法總結(jié)

    C++中訪問(wèn)字符串的三種方法總結(jié)

    以下是對(duì)C++中訪問(wèn)字符串的三種方法進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-10-10
  • C語(yǔ)言中時(shí)間的基本用法小結(jié)

    C語(yǔ)言中時(shí)間的基本用法小結(jié)

    處理時(shí)間是編程中經(jīng)常遇到的問(wèn)題,C語(yǔ)言中提供了一些時(shí)間處理函數(shù),在此記錄下一些基本的用法。下面這篇文章主要給大家介紹了C語(yǔ)言中關(guān)于時(shí)間的基本用法的相關(guān)資料,需要的朋友可以參考借鑒,感興趣的朋友們來(lái)一起看看吧。
    2017-01-01
  • C語(yǔ)言中條件判斷的正確使用姿勢(shì)

    C語(yǔ)言中條件判斷的正確使用姿勢(shì)

    在C語(yǔ)言中,有三種條件判斷結(jié)構(gòu):if語(yǔ)句、if-else語(yǔ)句和switch語(yǔ)句,這篇文章主要來(lái)和大家講解一下它們的正確使用姿勢(shì),需要的可以參考一下
    2023-05-05
  • c++ 入門(mén)——淺析構(gòu)造函數(shù)和析構(gòu)函數(shù)

    c++ 入門(mén)——淺析構(gòu)造函數(shù)和析構(gòu)函數(shù)

    這篇文章主要介紹了c++ 淺析構(gòu)造函數(shù)和析構(gòu)函數(shù)的相關(guān)資料,幫助大家入門(mén)c++ 編程,感興趣的朋友可以了解下
    2020-08-08
  • C語(yǔ)言內(nèi)存對(duì)齊實(shí)例詳解

    C語(yǔ)言內(nèi)存對(duì)齊實(shí)例詳解

    這篇文章主要介紹了C語(yǔ)言內(nèi)存對(duì)齊,包括內(nèi)存對(duì)其的基本概念及用法,以及注意事項(xiàng),并以實(shí)例形式加以說(shuō)明,需要的朋友可以參考下
    2014-09-09
  • C語(yǔ)言之單鏈表的插入、刪除與查找

    C語(yǔ)言之單鏈表的插入、刪除與查找

    本篇文章主要介紹了從單鏈表的創(chuàng)建、遍歷到節(jié)點(diǎn)的插入、刪除與查找功能的實(shí)現(xiàn),有需要的朋友可以參考下
    2015-07-07

最新評(píng)論

随州市| 扶绥县| 烟台市| 瑞丽市| 琼结县| 大埔县| 信宜市| 绍兴市| 靖宇县| 黄龙县| 阆中市| 罗江县| 汶川县| 综艺| 灌南县| 平潭县| 叙永县| 桂东县| 垫江县| 三河市| 乌拉特后旗| 阿城市| 新密市| 乐安县| 阳新县| 和硕县| 五家渠市| 谷城县| 肇州县| 湖州市| 双江| 汾西县| 睢宁县| 文登市| 神农架林区| 本溪市| 敖汉旗| 长春市| 霍邱县| 扎赉特旗| 湘乡市|