2017-05-06 19 views
0

最後に押されたキーのASCIIコードをx秒ごとに出力します。例としてx秒ごとに異なる出力で何かを表示

iは(97)を押した場合、端末は、97すべてのX秒を示すべきです。今、w(119)を押すと、プログラムは97の代わりに119を出力します。 これまでのところ、私のプログラムは私が押した最初のキーを印刷しています。

int main(int argc, char const *argv[]){ 
     printf("Hello World!"); 
     while(1){ 
      movePlayer(); 
      fflush(stdout); 
      sleep(1); 
     } 
     return 0; 
} 

void movePlayer(){ 
    system("/bin/stty raw"); 
    int input = getchar(); //support_readkey(1000); 
    //fprintf(stdout, "\033[2J"); 
    //fprintf(stdout, "\033[1;1H"); 
    printf("\b%d",input); 
    system("/bin/stty cooked"); 
} 

EDIT:ここ

は、メインおよびその他の方法です私は今てきたテストの少し私の問題を解決する方法で

int read_the_key(int timeout_ms) { 
    struct timeval tv = { 0L, timeout_ms * 1000L }; 
    fd_set fds; 
    FD_ZERO(&fds); 
    FD_SET(0, &fds); 
    int r = select(1, &fds, NULL, NULL, &tv); 
    if (!r) return 0; 

    return getchar(); 
} 
+0

に戻りますのgetchar内容を表示。代わりに 'read'を使う必要があります。 –

答えて

0

getchar()の文字が1つだけになるまで待ちます。したがって、

while(1){ 
    movePlayer(); // getchar() and printf() here 
    fflush(stdout); 
    sleep(1); 
} 

この現象が発生します。あなたは1文字を読んで、movePlayer()でそれを印刷します。次に、出力バッファをフラッシュしてスリープ状態になります。それから、あなたはちょうど繰り返します。つまり、あなたは再び入力しなければなりません。

入力を保存し、必要に応じてもう一度印刷します。しかし、あなたの関数は常にが到着するのを待つでしょう。ここで


が提案されているよう read()と試みているが、それは今あるとして、それはあなたのコードと同様の挙動を持つことになります。

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int old_c = -1; 
char c[1] = {0}; 

void movePlayer(); 

int main(int argc, char const *argv[]){ 
     while(1) { 
     movePlayer(); 
     fflush(stdout); 
     sleep(1); 
     } 
     return 0; 
} 

void movePlayer(){ 
    system("/bin/stty raw"); 
    if(read(STDIN_FILENO, c, sizeof(c)) > 0) 
     old_c = (int)c[0]; 
    if(old_c == -1) 
     old_c = (int)c[0]; 
    printf("\b%d", old_c); 
    system("/bin/stty cooked"); 
} 

に行くためにread() from stdinをお読みください。待ってから返す文字数はread()だが、ユーザーが新しい文字を入力してread()を入力してユーザーの入力を待つかどうかを知る方法は?

その結果、少なくとも私が知る限り、簡単な方法で、あなたが望むことはできないと言います。あなたのプログラムはstdinに古い入力を送ることができます。その結果、プログラムはユーザーの入力を読み取るという印象を与えます。しかし、ユーザーが実際に新しい入力を入力した場合、プログラムはそのケースを注意深く処理する必要があります。

+0

ええとそれを印刷しますか?あなたがstdinからの入力を待つことをブロックされているなら、毎秒何かをやっているわけではありません。 –

+0

@BoundaryImpositionは、彼の関数に 'getchar()'があるので、常にハングします! – gsamaras

+0

ありがとうございます。私は今、私のポストで編集された解決策を持っています。 – Fleksiu

0

セットアップSIGALARMハンドラ、x秒後のセットアップアラームをすることができますし、それは正確に一つの文字のために `getchar`待機しているハンドラ

関連する問題