麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C > 正文

深入解析GetChar的緩存機制

2020-02-24 14:27:28
字體:
來源:轉載
供稿:網友

在C/C++語言中,通常使用字符數組和MalC/Nead等內存分配函數來實現緩沖器,本文是武林技術頻道小編為大家帶來的深入解析GetChar的緩存機制,希望對你學習這方面知識有幫助!

第一個例子(與getchar有關):

?

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


代碼如上,當輸入一個字符按下回車后程序沒有等待你二次輸入就結束了,而且無論輸入什么運行結果均是10,是不是很奇怪(反正我第一次遇到時感覺是很奇怪),更奇怪的是當你一次性輸入多個字符如abcd結果又正確的打印出了98,為什么呢?這就是緩沖區的原因。

?

解釋如下:getchar定義在stdio.h文件中,我們在stdio.h中可以找到其相關的定義:

?

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


我們又找到getc的定義

?

?

?


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


將其展開即得:

?

?

?


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

?

?

?


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


代碼譯如下stdin是標準輸入流,查看MSDN與stdio.h中可以看到定義如下:

?

Stdio.h中:

?

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


跟蹤即可得:

?

?

?


_CRTIMP extern FILE _iob[];?


從上面代碼可得_iob是FILE結構類型的,查看stdio.h中可以看到FILE結構體定義如下:

?

?

?


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

?

?


從FILE結構中我們可以得到了上面getc宏定義中使用的_cnt,_ptr成員,但這些都是次要的,我們應該不難發現有這樣幾個成員_bufsize,_base分別對應的是緩沖區大小,緩沖區基地址,從這里得到一個顯而意見的結論就是getchar函數使用了緩沖機制。(_cnt對應的是緩沖區的輸入的字節數目,_ptr對應的是讀指針的位置)

?

getc宏定義詳解

?

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


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

?

好了,講了這么多都是鋪墊,現在回到正題為什么會出現上述結果:)

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

當輸入abc的時候分析一樣,只不過掃行了第二個getchar后,cnt=2,ptr指向了位置2。

以上就是關于深入解析GetChar的緩存機制,相信一定能幫到你的,如果你覺得我們的文章對你有用,建議你可以好好收藏,更多的專業知識就請關注武林技術頻道吧!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 麻豆视频在线观看 | 在线中文字幕播放 | 羞羞视频.www在线观看 | 色999中文字幕 | 久久久99精品视频 | 毛片免费视频观看 | 黄色毛片视频在线观看 | 色视频在线播放 | 成人黄色小视频网站 | 欧美精品免费一区二区三区 | 4399一级成人毛片 | 色99久久 | 久久手机在线视频 | 免费在线性爱视频 | 久久精品一区二区三 | 87成人免费看片 | av在线网站观看 | 日本精品视频一区二区三区四区 | 国产精品久久久久久久久久尿 | 欧美一级高潮 | www国产成人免费观看视频,深夜成人网 | 国产日韩大片 | 欧美成人免费香蕉 | 日韩精品羞羞答答 | 久久精品久久精品久久精品 | 久久久久免费精品国产小说色大师 | 久久精品九九 | 久久久久久久久久久av | 在线中文资源免费 | 欧美久久久一区二区三区 | 久久视频精品 | 丁香天堂网 | 大胆在线日本aⅴ免费视频 美国黄色毛片女人性生活片 | 亚洲精品久久久久久久久久久 | 精精国产xxxx视频在线野外 | 国产精品一 | 亚洲日本韩国精品 | 欧美aaaaa一级毛片在线 | 色中色激情影院 | 国产美女爽到喷白浆的 | 一本色道久久综合狠狠躁篇适合什么人看 |