日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

與緩存區相關最常見的操作就是字符的輸入與輸出操作getchar,getc,getch,getche,gets系列函數。
第一個例子(與getchar有關):

代碼如上,當輸入一個字符按下回車后程序沒有等待你二次輸入就結束了,而且無論輸入什么運行結果均是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中可以看到定義如下:

MSDN:

FILEstructure
Stores information about current state of stream; used in all stream I/O operations.
STDIO.H

Stdio.h中:

#define stdin  (&_iob[0])

跟蹤即可得:

_CRTIMP extern FILE _iob[];

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

從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。

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

分享到:
標簽:緩存 函數 機制 語言 getchar
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定