輸入執行GetChar快取機制剖析

2021-09-06 09:59:51 字數 3000 閱讀 5765

與快取區相關最常見的操縱就是字元的輸入與輸出操縱getchar,getc,getch,getche,gets系列函式。

第乙個例子(

與getchar有關)

#includeint main()

**如上,當輸入乙個字元按下回車後程式沒有等待你二次輸入就結束了,而且無論輸入什麼執行結果均是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 ;
從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。

文章結束給大家分享下程式設計師的一些笑話語錄: 警告

有乙個小夥子在乙個辦公大樓的門口抽著煙,乙個婦女路過他身邊,並對他 說, 「你知道不知道這個東西會危害你的健康?我是說, 你有沒有注意到香菸 盒上的那個警告(warning)?」

小夥子說,「沒事兒,我是乙個程式設計師」。

那婦女說,「這又怎樣?」

程式設計師說,「我們從來不關心 warning,只關心 error」

--------------------------------- 原創文章 by

輸入和執行

---------------------------------

GetChar快取機制深入剖析

與快取區相關最常見的操作就是字元的輸入與輸出操作getchar,getc,getch,getche,gets系列函式。第乙個例子 與getchar有關 複製 如下 include int main 如上,當輸入乙個字元按下回車後程式沒有等待你二次輸入就結束了,而且無論輸入什麼執行結果均是10,是不是...

IOS 開發快取機制 記憶體快取機制

使用快取的目的是為了使用的應用程式能更快速的響應使用者輸入,是程式高效的執行。有時候我們需要將遠端 web伺服器獲取的資料快取起來,減少對同乙個 url多次請求。記憶體快取我們可以使用 sdk中的 nsurlcache類。nsurlrequest需要乙個快取引數來說明它請求的 url何如快取資料的,...

用getchar和putchar輸入輸出字元

用getchar函式讀入兩個字元給c1,c2,然後用putchar函式輸出這兩個字元。include stdafx.h include using namespace std int tmain int argc,tchar argv 如果要輸出這兩個字元的ascii碼,應如何處理?include ...