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

首頁 > 編程 > C > 正文

GetChar緩存機制深入剖析

2020-01-26 15:53:00
字體:
來源:轉載
供稿:網(wǎng)友

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

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

復制代碼 代碼如下:

#include<stdio.h> 
int main() 

    int ch; 
    ch=getchar(); 
    ch=getchar(); 
    printf("%d/n",ch); 
    return 0; 


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

解釋如下: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成員,但這些都是次要的,我們應該不難發(fā)現(xiàn)有這樣幾個成員_bufsize,_base分別對應的是緩沖區(qū)大小,緩沖區(qū)基地址,從這里得到一個顯而意見的結論就是getchar函數(shù)使用了緩沖機制。(_cnt對應的是緩沖區(qū)的輸入的字節(jié)數(shù)目,_ptr對應的是讀指針的位置)

getc宏定義詳解

復制代碼 代碼如下:

--(stdin)->_cnt>=0 

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

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

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

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

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

圖片精選

主站蜘蛛池模板: 91网页视频入口在线观看 | 久久久日韩精品一区二区 | 高清国产午夜精品久久久久久 | 中文日产幕无线码6区免费版 | 国产一级毛片视频在线! | 本站只有精品 | 久草在线观看福利视频 | 成人在线免费观看小视频 | 羞羞网站在线观看入口免费 | 成码无人av片在线观看网站 | 亚洲欧美在线视频免费 | 成人免费观看在线 | www.9191.com| 特片网久久 | 色屁屁xxxxⅹ在线视频 | 国产一区亚洲 | 久草在线视频看看 | 黄污在线看 | 欧美 亚洲 激情 | 国产精品av久久久久久网址 | 欧美日韩精品一区二区三区不卡 | wwwcom国产| xxxxhd73国产 | 色毛片| 久久久久久久亚洲精品 | 综合精品一区 | 国产精品午夜小视频观看 | 羞羞网站在线观看入口免费 | 亚洲视频在线观看免费 | 国产在线观看免费视频软件 | 国产三级三级三级三级 | 欧洲精品色 | 电影91 | 亚洲九草 | 91成人午夜性a一级毛片 | 精品国产一区二区亚洲人成毛片 | 国产色视频一区 | 久章草影院| 国产一区二区三区在线视频 | 欧美精品一区二区三区久久久 | 久久性生活免费视频 |