a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 編程 > C > 正文

深入解析GetChar的緩存機(jī)制

2020-02-24 14:27:28
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

在C/C++語(yǔ)言中,通常使用字符數(shù)組和MalC/Nead等內(nèi)存分配函數(shù)來(lái)實(shí)現(xiàn)緩沖器,本文是武林技術(shù)頻道小編為大家?guī)?lái)的深入解析GetChar的緩存機(jī)制,希望對(duì)你學(xué)習(xí)這方面知識(shí)有幫助!

第一個(gè)例子(與getchar有關(guān)):

?

#include<stdio.h>?
int main()?
{?
??? int ch;?
??? ch=getchar();?
??? ch=getchar();?
??? printf("%d/n",ch);?
??? return 0;?
}?


代碼如上,當(dāng)輸入一個(gè)字符按下回車(chē)后程序沒(méi)有等待你二次輸入就結(jié)束了,而且無(wú)論輸入什么運(yùn)行結(jié)果均是10,是不是很奇怪(反正我第一次遇到時(shí)感覺(jué)是很奇怪),更奇怪的是當(dāng)你一次性輸入多個(gè)字符如abcd結(jié)果又正確的打印出了98,為什么呢?這就是緩沖區(qū)的原因。

?

解釋如下:getchar定義在stdio.h文件中,我們?cè)趕tdio.h中可以找到其相關(guān)的定義:

?

#define getchar()???????? getc(stdin)//即getchar等同于調(diào)用getc(stdin)


我們又找到getc的定義

?

?

?


#define getc(_stream)???? (--(_stream)->_cnt >= 0 /?
??????????????? ? 0xff & *(_stream)->_ptr++ : _filbuf(_stream))?


將其展開(kāi)即得:

?

?

?


if(--(stdin)->_cnt>=0)?
  ??? return 0xff&*(stdin)->ptr++;?

?

?

?


else?
??????? return filbuf(stdin);?


代碼譯如下stdin是標(biāo)準(zhǔn)輸入流,查看MSDN與stdio.h中可以看到定義如下:

?

Stdio.h中:

?

#define stdin? (&_iob[0])?


跟蹤即可得:

?

?

?


_CRTIMP extern FILE _iob[];?


從上面代碼可得_iob是FILE結(jié)構(gòu)類(lèi)型的,查看stdio.h中可以看到FILE結(jié)構(gòu)體定義如下:

?

?

?


struct _iobuf {?
??????? char *_ptr;?
??????? int?? _cnt;?
??????? char *_base;?
??????? int?? _flag;?
??????? int?? _file;?
??????? int?? _charbuf;?
??????? int?? _bufsiz;?
??????? char *_tmpfname;?
??????? };?

?

?


從FILE結(jié)構(gòu)中我們可以得到了上面getc宏定義中使用的_cnt,_ptr成員,但這些都是次要的,我們應(yīng)該不難發(fā)現(xiàn)有這樣幾個(gè)成員_bufsize,_base分別對(duì)應(yīng)的是緩沖區(qū)大小,緩沖區(qū)基地址,從這里得到一個(gè)顯而意見(jiàn)的結(jié)論就是getchar函數(shù)使用了緩沖機(jī)制。(_cnt對(duì)應(yīng)的是緩沖區(qū)的輸入的字節(jié)數(shù)目,_ptr對(duì)應(yīng)的是讀指針的位置)

?

getc宏定義詳解

?

--(stdin)->_cnt>=0?


此句判斷是否緩沖區(qū)內(nèi)有數(shù)據(jù),有的話就減一(表示又讀了一個(gè)),并讀取數(shù)據(jù)return 0xff&*(stdin)->ptr++,讀完成后,將讀指針向前移一個(gè)位置【重要】

?

好了,講了這么多都是鋪墊,現(xiàn)在回到正題為什么會(huì)出現(xiàn)上述結(jié)果:)

出現(xiàn)上述結(jié)果追根結(jié)底還是由于getchar函數(shù)使用了緩沖(看了上面的,我想大家也知道了,確實(shí)使用了緩沖),當(dāng)輸入一個(gè)字符按下回車(chē)后程序沒(méi)有等待你二次輸入就結(jié)束了,而且無(wú)論輸入什么運(yùn)行結(jié)果均是10,這是因?yàn)楫?dāng)用戶輸入了一個(gè)字符后,并按下回車(chē)后,緩沖中會(huì)存入用戶輸入的字符以及換行鍵的ASCII碼(10 ~)【略去的回車(chē)的ASCII碼13,可能是為了跨平臺(tái),在Linux下,回車(chē)后就是換行10,Windows下回車(chē)是先回車(chē)回到首行,再換行,即13 10】(執(zhí)行第一次getchar實(shí)際上是執(zhí)行g(shù)etc的else語(yǔ)句,填充緩存區(qū)后_cnt=2,_prt指向0位置,執(zhí)行完后_cnt=1,_prt指向1位置),第二次執(zhí)行g(shù)etchar時(shí),調(diào)用getc不會(huì)再執(zhí)行else語(yǔ)句,執(zhí)行的是if語(yǔ)句,故第二次不再等待用戶輸入了,直接執(zhí)行,執(zhí)行后cnt=0,prt指向位置2,并返回ptr指向位置1時(shí)的結(jié)果,即10,由于10為換行鍵,當(dāng)執(zhí)行遇到此時(shí),會(huì)在執(zhí)行完后清空緩存,ptr重新指向了位置0,cnt=0。

當(dāng)輸入abc的時(shí)候分析一樣,只不過(guò)掃行了第二個(gè)getchar后,cnt=2,ptr指向了位置2。

以上就是關(guān)于深入解析GetChar的緩存機(jī)制,相信一定能幫到你的,如果你覺(jué)得我們的文章對(duì)你有用,建議你可以好好收藏,更多的專(zhuān)業(yè)知識(shí)就請(qǐng)關(guān)注武林技術(shù)頻道吧!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 色优久久| 精品国产乱码久久久久久牛牛 | 日韩在线观看中文字幕 | 亚洲欧洲日本国产 | 国产精品福利一区 | 九九99视频 | 亚洲人成电影网 | 福利片免费观看 | av先锋资源 | 日韩色综合 | 黄a一级 | www.成人.com | 人人看超碰 | www.一区二区三区 | 精品一区二区久久久久久久网站 | 狠狠色狠狠色合久久伊人 | av网址在线播放 | 日本在线免费电影 | 国产成人啪精品午夜在线观看 | 久久久久国产 | 国产不卡视频一区二区三区 | 亚洲成a人v欧美综合天堂麻豆 | 狠狠躁夜夜躁人人爽天天天天97 | 亚洲区国产区 | 91人人澡人人爽 | www.xxx免费| 国产一区二区三区四区在线观看 | 亚洲成人精品久久 | 欧美一区精品 | 欧洲毛片| 一级片免费观看 | 亚洲国产精品成人 | 国产精品久久久久久久久久免费 | 日韩免费视频一区二区 | 亚洲一区国产精品 | 国产一级片 | 亚洲九九 | 日本不卡一区二区 | 国产日韩精品视频 | 国产精品无码久久久久 | 国产一区日韩在线 |