執行而如果我有以下幾點:用getchar函數
while (getchar() != 'y')
printf("some...");
我想知道,如果while
測試字符只有當緩衝區爲空。
所以,如果我輸入
abcdy[enter]
那麼[enter]
後while
執行?
有getchar
本身是while
要測試何時按下輸入?
執行而如果我有以下幾點:用getchar函數
while (getchar() != 'y')
printf("some...");
我想知道,如果while
測試字符只有當緩衝區爲空。
所以,如果我輸入
abcdy[enter]
那麼[enter]
後while
執行?
有getchar
本身是while
要測試何時按下輸入?
getchar()
塊在系統級。
雖然getchar()
被封鎖,只要按下幾個按鍵,移動鼠標,切換窗口,有啤酒,...,...
getchar()
當你鍵入回車在正確的窗口將解除。然後你的程序會連續看到所有擊鍵,直到幷包括ENTER。
不,它將在任何*按鍵上解除阻止。你正在考慮'gets' –
我不使用'gets()'!它不是阻塞的'getchar()',它是阻塞(並緩衝字符)的操作系統。 – pmg
「試試看看」可以告訴你什麼是事情,但不是它是什麼應該要做。
在這種情況下,while
環路的行爲是從代碼明顯的:它會繼續直到getchar
返回值'y'
;當getchar返回'\n'
或EOF
或'y'
以外的任何內容時它不會停止。
對於getchar
自身的行爲,從終端閱讀,基本上有三種情況擔心:
如果事情已經鍵入但尚未閱讀,getchar
將返回一個字符。 getchar
本身並不在乎行界限; 輸入導致它返回'\n'
。但是,終端(仿真器)只能以整行的形式向程序提供輸入,具體取決於它所處的模式,因此,如果用戶鍵入了abc
,但尚未輸入,則輸入您實際上可能處於狀態3(如下)。
如果終端已經被關閉(或通過鍵入^d僞閉合)和所有輸入到這一點已被讀取,getchar
將返回EOF
,這不等於任何字符值。它會一遍又一遍地重複,直到應用程序停止調用它。您的代碼是越野車因爲它不檢查EOF
:如果終端關閉,它將永久卡在循環中。 (由於正常運行程序,這可能並不明顯,因爲關閉一個終端會立即發送一個SIGHUP
信號,它將(默認情況下)終止進程。嘗試運行它作爲./a.out < /dev/null
以查看無限循環。)
如果所有輸入的內容都已被讀取,但終端仍處於打開狀態,則在發生更多打字或終端關閉之前,getchar
將不會返回。底層的read
系統調用被稱爲塊,這意味着內核將CPU從您的進程中分離出來,直到更多的輸入變爲可用(並讓其他程序執行;它不是一個等待輸入的旋轉循環,正如人們可能想象的那樣一個用於在DOS下的kbhit
/getch
)。
您是否嘗試過運行該程序? – Ryan
@minitech,是的,它的工作原理。爲什麼? – xdevel2000