2011-11-17 75 views
2

如果用戶在調用fgetc(STDIN)時鍵入多個字符,則對fgetc(STDIN)的另一個調用將不會請求新字符,並將使用緩衝區中的下一個字符。我解決這個問題的一種方法是創建以下功能:如何在使用fgetc(STDIN)後在PHP中刷新stdin?

<?php 
    function get_char_from_stdin() { 
     if (($char = fgetc(STDIN)) != "\n") 
      fgets(STDIN); 
     return $char; 
    } 
?> 

有沒有比上面更優雅的解決方案?

P.S.如果我的術語關閉,請原諒我。請糾正任何濫用的條款。謝謝。

編輯:這是否在Windows上工作?我現在正在使用Mac。

+1

它似乎是在Windows上工作。我試過'php -r'while($ char!='。'){$ char = fgetc(STDIN); echo $ char;}「'它起作用,我可以輸入字符! –

+0

你爲什麼使用''。''? –

+0

順便說一句,'$ char'在該腳本的開始處是未定義的,但除非您告訴PHP做其他事情,否則它將繼續愉快地繼續徘徊(我個人認爲這會起反作用)。 –

回答

0

STDIN被緩衝,所以爲了獲得調用函數後輸入的第一個字符,必須用空緩衝區打開一個新流。

function get_char_from_stdin() { 
    $stdin = fopen('php://stdin', 'r'); 
    return fgetc($stdin); 
} 
+0

好吧,事實證明這隻適用於一個換行符,但它仍然只是將下一行作爲輸入。 – Bluewind

+0

你的意思是「它仍然只是把下一行作爲輸入」? –

+0

它不會跳過函數調用之前輸入的行,也不會跳過空行。它所做的只是讀取第一行的一個字符,然後跳過該行的其餘部分,即使您在兩次調用之間輸入5行,下一次調用也會讀取第二行。我想你真正想要的是它跳過了在函數調用之間輸入的所有內容,當你調用它時,等待下一個輸入。 – Bluewind