2014-03-13 51 views
1

執行而如果我有以下幾點:用getchar函數

while (getchar() != 'y') 
    printf("some..."); 

我想知道,如果while測試字符只有當緩衝區爲空。

所以,如果我輸入

abcdy[enter] 

那麼[enter]while執行?

getchar本身是while要測試何時按下輸入?

+5

您是否嘗試過運行該程序? – Ryan

+0

@minitech,是的,它的工作原理。爲什麼? – xdevel2000

回答

2

getchar是一個阻塞調用,即它將等待,直到你給它輸入。

+0

所以在沖洗緩衝區之後,執行...並處理我輸入的所有字符...... – xdevel2000

0

getchar()塊在系統級。

雖然getchar()被封鎖,只要按下幾個按鍵,移動鼠標,切換窗口,有啤酒,...,...

getchar()當你鍵入回車在正確的窗口將解除。然後你的程序會連續看到所有擊鍵,直到幷包括ENTER。

+0

不,它將在任何*按鍵上解除阻止。你正在考慮'gets' –

+0

我不使用'gets()'!它不是阻塞的'getchar()',它是阻塞(並緩衝字符)的操作系統。 – pmg

1

「試試看看」可以告訴你什麼是事情,但不是它是什麼應該要做。

在這種情況下,while環路的行爲是從代碼明顯的:它會繼續直到getchar返回值'y';當getchar返回'\n'EOF'y'以外的任何內容時它不會停止。

對於getchar自身的行爲,從終端閱讀,基本上有三種情況擔心:

  1. 如果事情已經鍵入但尚未閱讀,getchar將返回一個字符。 getchar本身並不在乎行界限; 輸入導致它返回'\n'。但是,終端(仿真器)只能以整行的形式向程序提供輸入,具體取決於它所處的模式,因此,如果用戶鍵入了abc,但尚未輸入,則輸入您實際上可能處於狀態3(如下)。

  2. 如果終端已經被關閉(或通過鍵入^d僞閉合)和所有輸入到這一點已被讀取,getchar將返回EOF,這不等於任何字符值。它會一遍又一遍地重複,直到應用程序停止調用它。您的代碼是越野車因爲它不檢查EOF:如果終端關閉,它將永久卡在循環中。 (由於正常運行程序,這可能並不明顯,因爲關閉一個終端會立即發送一個SIGHUP信號,它將(默認情況下)終止進程。嘗試運行它作爲./a.out < /dev/null以查看無限循環。)

  3. 如果所有輸入的內容都已被讀取,但終端仍處於打開狀態,則在發生更多打字或終端關閉之前,getchar將不會返回。底層的read系統調用被稱爲,這意味着內核將CPU從您的進程中分離出來,直到更多的輸入變爲可用(並讓其他程序執行;它不是一個等待輸入的旋轉循環,正如人們可能想象的那樣一個用於在DOS下的kbhit/getch)。

+0

*「您的代碼有問題,因爲它不檢查EOF:如果終端關閉,它將永久卡在循環中。」*它通常不會終止掛斷信號嗎? – Ryan

+0

@minitech Yah,我可能試圖掩蓋不相關的細節太難。請參閱編輯。 – zwol