亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

GetChar緩存機制深入剖析

2020-01-26 15:53:00
字體:
來源:轉載
供稿:網友

與緩存區相關最常見的操作就是字符的輸入與輸出操作getchar,getc,getch,getche,gets系列函數。

第一個例子(與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。

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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品日本亚洲专区61| 国产精品专区h在线观看| 欧美一级淫片videoshd| 国产成人精品日本亚洲专区61| 亚洲国产高潮在线观看| 久久中文精品视频| 播播国产欧美激情| 国产69精品久久久久久| 欧美俄罗斯乱妇| 国产精品久久久999| 国产精品91免费在线| 亚洲第一综合天堂另类专| 亚洲夜晚福利在线观看| 欧美自拍大量在线观看| 亚洲最大福利视频网| 亚洲美女中文字幕| 国产精品91一区| 青青久久av北条麻妃黑人| 国产男人精品视频| 日韩成人中文字幕| 欧美精品九九久久| 亚洲欧美日韩精品久久| 国产精品久久久久999| 国产亚洲精品美女久久久| 久久这里有精品| 久热精品视频在线观看| 亚洲成人动漫在线播放| 欧美午夜激情视频| 1769国内精品视频在线播放| 亚洲成人教育av| 日韩美女视频中文字幕| 91视频国产高清| 国产精品第10页| 亚洲国产精彩中文乱码av在线播放| 青草成人免费视频| 一本色道久久综合狠狠躁篇的优点| 欧美精品videosex极品1| 欧美一二三视频| 国产午夜精品视频免费不卡69堂| 精品一区电影国产| 日韩精品在线免费| 日韩高清免费在线| 国产欧美精品一区二区三区介绍| 亚洲色图第一页| 欧美视频中文在线看| 欧美高清视频免费观看| 亚洲天天在线日亚洲洲精| 久久久久久久爱| 成人国产精品免费视频| 中国china体内裑精亚洲片| 插插插亚洲综合网| 国产精品久久久久久亚洲影视| 亚洲免费高清视频| 国产精品丝袜视频| 久久久国产一区| 欧美日韩亚洲精品内裤| 国产精品久久av| 久久精品成人一区二区三区| 日韩视频一区在线| 欧美性生活大片免费观看网址| 国产日韩欧美另类| 国产精品一区二区电影| 欧亚精品在线观看| 57pao国产成人免费| 欧美精品在线观看91| 色777狠狠综合秋免鲁丝| 亚洲成人网久久久| 91chinesevideo永久地址| 久久在线免费观看视频| 国产精品视频白浆免费视频| 欧美国产一区二区三区| 91视频免费在线| 久久99久久久久久久噜噜| 国产99久久久欧美黑人| 色婷婷**av毛片一区| 欧美一级大片在线免费观看| 97香蕉久久夜色精品国产| 日本成人免费在线| 日韩中文字幕久久| 日本精品一区二区三区在线播放视频| 羞羞色国产精品| 成人天堂噜噜噜| 日韩一区在线视频| 亚洲成人久久一区| 丝袜情趣国产精品| 午夜精品一区二区三区av| 中文字幕久久精品| 日韩视频在线免费观看| 97在线视频免费| 欧美丰满少妇xxxxx做受| 亚洲天堂第一页| 国内精品久久久久久影视8| 57pao成人永久免费视频| 亚洲欧美日韩区| 在线日韩中文字幕| 97成人精品视频在线观看| 欧美一乱一性一交一视频| 综合网中文字幕| 国产成人精品国内自产拍免费看| 欧美性xxxx极品hd满灌| 国产成人精品视频| 国产欧美日韩精品丝袜高跟鞋| 福利一区福利二区微拍刺激| 国产99久久精品一区二区| 自拍偷拍免费精品| 在线电影欧美日韩一区二区私密| 日韩一区二区在线视频| 国产精品白丝av嫩草影院| 亚洲黄色av女优在线观看| 亚洲欧美日韩图片| 亚洲激情国产精品| 国产成人精品在线视频| 亚洲在线一区二区| 精品福利视频导航| 一区二区三区亚洲| 久久国产加勒比精品无码| 曰本色欧美视频在线| 色偷偷9999www| 日韩经典一区二区三区| 欧美性猛交xxxx富婆| 亚洲激情视频在线播放| 78m国产成人精品视频| 国产在线观看不卡| 992tv成人免费影院| 日韩一区二区精品视频| 岛国av一区二区在线在线观看| 欧美成人自拍视频| 伊人久久精品视频| 96精品视频在线| 亚洲美女性生活视频| 色综合久久天天综线观看| 国产精品黄色影片导航在线观看| 欧美日韩日本国产| 国产91精品不卡视频| 欧美性猛交xxxx乱大交3| 久久久久国色av免费观看性色| 夜夜嗨av色综合久久久综合网| 一个人看的www久久| 亚洲一区二区三区sesese| 欧美亚洲成人网| 亚洲第一区在线观看| 国产日韩在线看| 亚洲成色www8888| 成人在线小视频| 91精品国产高清久久久久久91| 久久久最新网址| 欧美激情小视频| 日韩精品在线视频观看| 亚洲视频在线观看免费| 久久久久中文字幕2018| 国产欧美精品一区二区三区介绍| 一区二区日韩精品| 欧美黑人一区二区三区| 欧美一级片久久久久久久| 91av免费观看91av精品在线| 97久久精品视频| 国产免费一区二区三区在线观看| 中文字幕精品—区二区| 国产成人精品久久二区二区91| 亚洲国产精品网站| 综合激情国产一区| 国产精品情侣自拍| 亚洲精品一区二区三区不| 日韩国产高清污视频在线观看|