與快取區相關最常見的操縱就是字元的輸入與輸出操縱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 ...