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

詳細(xì)聊聊c語(yǔ)言中的緩沖區(qū)問(wèn)題

 更新時(shí)間:2021年11月21日 10:12:51   作者:厚積薄發(fā)?  
緩沖區(qū)又稱為緩存,它是內(nèi)存空間的一部分,也就是說(shuō)在內(nèi)存空間中預(yù)留了一定的存儲(chǔ)空間,這些存儲(chǔ)空間用來(lái)緩沖輸入或輸出的數(shù)據(jù),這部分預(yù)留的空間就叫做緩沖區(qū),這篇文章主要給大家介紹了關(guān)于c語(yǔ)言中緩沖區(qū)問(wèn)題的相關(guān)資料,需要的朋友可以參考下

發(fā)現(xiàn)問(wèn)題

你是不是總會(huì)出現(xiàn)當(dāng)你輸入的時(shí)候(你想的是只輸出一個(gè)內(nèi)容),但是最后卻輸入兩個(gè)。

比如下面這個(gè)例子

?那這到底是是哪出了問(wèn)題呢?

沒(méi)錯(cuò)這就是關(guān)于緩沖區(qū)的問(wèn)題。

我們先仔細(xì)了解這個(gè)題目

例題

判斷字母是否為元音字母包括大小寫。

看代碼實(shí)現(xiàn)(錯(cuò)誤的)

#include<stdio.h>
int main()
{
	int i = 0;
	char ch = 0;
	char yyzm[20] = { 'a','A','e','E','i','I','o','O','u','U' };
	while(scanf("%c", &ch)!=EOF)
	{
		for (i = 0; i < 10; i++)
		{
			if (ch == yyzm[i])
			{
				printf("元音字母\n");
				break;
			}
		}
		if (i == 10)
		{
			printf("輔音字母\n");
		}
	}
	
	return 0;
}

問(wèn)題原因

我們一般怎么輸入呢?

我們先輸入元音字母o然后在按一下回車,一般輸入都是這樣輸入的到底是哪出了問(wèn)題呢?

沒(méi)錯(cuò)就是那個(gè)回車惹的禍。每當(dāng)我們輸入一個(gè)字母的時(shí)候,scanf讀取字母之后,就會(huì)放入緩沖區(qū)中,回車一下當(dāng)然也會(huì)放個(gè)'\n'字符也就是空格,當(dāng)計(jì)算機(jī)拿取字符的時(shí)候先拿走一個(gè)字符,接著看里面還有沒(méi)有字符,如果有字符就會(huì)繼續(xù)讀取,如果沒(méi)有則進(jìn)行下面的內(nèi)容。

在我們這個(gè)代中由于是多次輸入數(shù)據(jù),就會(huì)讀入字符后第一個(gè)if語(yǔ)句結(jié)束,如果還有字符的話,計(jì)算機(jī)就會(huì)繼續(xù)拿字符,這時(shí)就拿了一個(gè)'\n','\n'不是元音字母就會(huì)進(jìn)入下一個(gè)if語(yǔ)句輸出。

那我們?nèi)绾谓鉀Q呢?

解決方法一:

在后面加入getchar(),它的作用就是清理緩存區(qū),由于輸入字符,計(jì)算機(jī)是一個(gè)一個(gè)字符讀取的,又因?yàn)槲覀兌啻屋斎耄詆etchar總是會(huì)讀取那個(gè)'\n';

解決方法二:

我們?cè)趕canf%c后面加個(gè)'\n',由于是一個(gè)一個(gè)讀取字符的,如果后面有'\n',就會(huì)把\n也拿走。

解決方案三:

在%c前面加個(gè)空格,這樣做的目的是每次讀取下一個(gè)字符時(shí),就會(huì)把上一個(gè)字符后面的'\n'清理掉。

正確的代碼:

#include<stdio.h>
int main()
{
	int i = 0;
	char ch = 0;
	char yyzm[20] = { 'a','A','e','E','i','I','o','O','u','U' };
	while(scanf(" %c", &ch)!=EOF)//可以在%c后面加個(gè)'\n',也可以在%c前面加個(gè)空格,目的是清理緩沖區(qū)
	{
		for (i = 0; i < 10; i++)
		{
			if (ch == yyzm[i])
			{
				printf("元音字母\n");
				break;
			}
		}
		if (i == 10)
		{
			printf("輔音字母\n");
		}
	}
	//getchar();清理緩沖區(qū)
	return 0;
}

出錯(cuò)二

當(dāng)我們用scanf輸入字符串的時(shí)候,如果遇到空格也會(huì)出現(xiàn)問(wèn)題,這時(shí)我們就可以引入另外一個(gè)函數(shù)那就是gets函數(shù)

gets函數(shù)引入

gets函數(shù)的優(yōu)點(diǎn)與scanf對(duì)比:

gets() 函數(shù)不僅比 scanf 簡(jiǎn)潔,而且,就算輸入的字符串中有空格也可以直接輸入,不用像 scanf 那樣要定義多個(gè)字符數(shù)組。

關(guān)于使用 gets() 函數(shù)需要注意:使用 gets() 時(shí),系統(tǒng)會(huì)將最后“敲”的換行符從緩沖區(qū)中取出來(lái),然后丟棄,所以緩沖區(qū)中不會(huì)遺留換行符。這就意味著,如果前面使用過(guò) gets(),而后面又要從鍵盤給字符變量賦值的話就不需要吸收回車清空緩沖區(qū)了,因?yàn)榫彌_區(qū)的回車已經(jīng)被 gets() 取出來(lái)扔掉了。(此段話是在網(wǎng)上查到的,整理為復(fù)習(xí)準(zhǔn)備,請(qǐng)見(jiàn)諒)。

我們來(lái)做個(gè)題吧

逆序字符串


#include<stdio.h>
#include<string.h>
void swap(char* str)
{
    int i = 0;
    int len = strlen(str);
    for (i = 0; i < len / 2; i++)
    {
        char tmp = 0;
        tmp = str[i];
        str[i] = str[len - i - 1];
        str[len - i - 1] = tmp;
    }
    printf("%s", str);
}
int main()
{
    //逆序字符串的內(nèi)容
    char str[100];
    int i = 0;
    gets(str);
    swap(str);
 
    return 0;
}

為什么要引入緩沖區(qū)

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

又比如,我們使用打印機(jī)打印文檔,由于打印機(jī)的打印速度相對(duì)較慢,我們先把文檔輸出到打印機(jī)相應(yīng)的緩沖區(qū),打印機(jī)再自行逐步打印,這時(shí)我們的CPU可以處理別的事情。

現(xiàn)在您基本明白了吧,緩沖區(qū)就是一塊內(nèi)存區(qū),它用在輸入輸出設(shè)備和CPU之間,用來(lái)緩存數(shù)據(jù)。它使得低速的輸入輸出設(shè)備和高速的CPU能夠協(xié)調(diào)工作,避免低速的輸入輸出設(shè)備占用CPU,解放出CPU,使其能夠高效率工作。?

緩沖區(qū)的類型

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

1) 全緩沖

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

2) 行緩沖

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

3) 不帶緩沖

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

總結(jié)

相關(guān)文章

  • C++實(shí)現(xiàn)LeetCode(103.二叉樹(shù)的之字形層序遍歷)

    C++實(shí)現(xiàn)LeetCode(103.二叉樹(shù)的之字形層序遍歷)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(103.二叉樹(shù)的之字形層序遍歷),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++利用std::forward_list查找插入數(shù)據(jù)方法示例

    C++利用std::forward_list查找插入數(shù)據(jù)方法示例

    這篇文章主要給大家介紹了關(guān)于C++利用std::forward_list查找插入數(shù)據(jù)的相關(guān)資料,文中先對(duì)std::forward_list進(jìn)行了詳細(xì)的介紹,而后通過(guò)示例代碼給大家介紹了查找的方法,需要的朋友可以參考借鑒,下面話不多說(shuō)了,來(lái)一起看看吧。
    2017-08-08
  • C++ Boost Optional示例超詳細(xì)講解

    C++ Boost Optional示例超詳細(xì)講解

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱
    2022-11-11
  • 詳解C語(yǔ)言中結(jié)構(gòu)體的使用

    詳解C語(yǔ)言中結(jié)構(gòu)體的使用

    結(jié)構(gòu)體是一些值的集合,這些值稱為成員變量,結(jié)構(gòu)體的每個(gè)成員可以是不同類型的變量。本文將通過(guò)示例為大家詳細(xì)講講C語(yǔ)言中結(jié)構(gòu)體的使用,需要的可以參考一下
    2022-07-07
  • VC++進(jìn)度條process Bar的用法實(shí)例

    VC++進(jìn)度條process Bar的用法實(shí)例

    這篇文章主要介紹了VC++進(jìn)度條process Bar的用法,是進(jìn)行VC++應(yīng)用程序開(kāi)發(fā)中非常常見(jiàn)的實(shí)用技巧,需要的朋友可以參考下
    2014-10-10
  • 詳解C++中賦值,關(guān)系,函數(shù)調(diào)用運(yùn)算符重載的實(shí)現(xiàn)

    詳解C++中賦值,關(guān)系,函數(shù)調(diào)用運(yùn)算符重載的實(shí)現(xiàn)

    本文主要為大家講解一下三個(gè)C++中的運(yùn)算符重載,分別是賦值運(yùn)算符重載、關(guān)系運(yùn)算符重載和函數(shù)調(diào)用運(yùn)算符重載,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-06-06
  • C語(yǔ)言由淺入深了解變量的應(yīng)用

    C語(yǔ)言由淺入深了解變量的應(yīng)用

    這篇文章主要介紹了C語(yǔ)言的變量,變量是C語(yǔ)言語(yǔ)法和語(yǔ)義中一個(gè)很重要的知識(shí)點(diǎn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 200行C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)易三子棋游戲

    200行C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)易三子棋游戲

    三子棋(井字棋)我們的童年或多或少都體驗(yàn)過(guò)這個(gè)游戲的樂(lè)趣,本子隨手一畫(huà)就是一局游戲的開(kāi)始,下面這篇文章主要給大家介紹了關(guān)于200行C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)易三子棋游戲的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • 簡(jiǎn)單掌握桶排序算法及C++版的代碼實(shí)現(xiàn)

    簡(jiǎn)單掌握桶排序算法及C++版的代碼實(shí)現(xiàn)

    桶排序是將要排序的算法按桶分組排序之后再遍歷匯總的一種線性排序算法,下面就讓我們來(lái)通過(guò)小例子簡(jiǎn)單掌握桶排序算法及C++版的代碼實(shí)現(xiàn)^^
    2016-07-07
  • C++友元(Friend)用法實(shí)例簡(jiǎn)介

    C++友元(Friend)用法實(shí)例簡(jiǎn)介

    這篇文章主要介紹了C++友元(Friend)用法,對(duì)于C++的學(xué)習(xí)來(lái)說(shuō)有很好的參考價(jià)值,需要的朋友可以參考下
    2014-08-08

最新評(píng)論

海盐县| 兴国县| 丰都县| 金门县| 永修县| 秭归县| 察雅县| 柳江县| 礼泉县| 老河口市| 南投县| 堆龙德庆县| 安泽县| 大厂| 泽普县| 神农架林区| 临邑县| 满洲里市| 措美县| 长兴县| 元朗区| 双峰县| 凉城县| 新田县| 诸暨市| 三亚市| 大城县| 邵东县| 高邮市| 文昌市| 横山县| 张家港市| 福泉市| 永吉县| 郸城县| 嵩明县| 城市| 樟树市| 娄底市| 佛教| 城口县|