2017-05-06 1 views
0

Ich möchte den ASCII-Code der letzten Taste, die ich gedrückt habe, jede x Sekunde ausgeben.Alle x Sekunden mit einem anderen Ausgang anzeigen

Als Beispiel:

Wenn ich ein (97) drücken, sollte das Terminal zeigt die 97 jede x Sekunde. Wenn ich jetzt das w (119) drücke, sollte das Programm jetzt die 119 statt der 97 drucken. Bis jetzt druckt mein Programm nur die erste Taste, die ich gedrückt habe.

Hier sind die Haupt- und die andere Methode:

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:

Mit ein wenig von Tests habe ich jetzt ein Verfahren, das mein Problem

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

es ist, weil 'getchar' für genau ein Zeichen wartet; Sie müssen stattdessen 'read' verwenden. –

Antwort

0

löst getchar() wartet auf nur ein Zeichen, also dies:

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

verursacht dieses Verhalten. Sie lesen ein Zeichen, Sie drucken es in movePlayer(). Dann spülen Sie den Ausgabepuffer und gehen Sie schlafen. Dann wiederholst du einfach, was bedeutet, dass du erneut eingeben musst.

Speichern Sie die Eingabe und drucken Sie sie erneut, wenn Sie dies wünschen. Allerdings wird Ihre Funktion immer warten, bis neue Eingabe eintrifft. Hier


ist ein Versuch, mit read() wie vorgeschlagen, aber es wird ein ähnliches Verhalten an Ihrem Code haben, wie es jetzt ist:

#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"); 
} 

Bitte lesen Sie read() from stdin zu gehen. Sie können read() für wie viele Zeichen warten und dann zurückgeben, aber wie werden Sie wissen, wenn der Benutzer ein neues Zeichen eingeben soll, um den Befehl read() auf die Eingabe des Benutzers zu warten?

Als Ergebnis würde ich sagen, dass Sie nicht tun können, was Sie wünschen, zumindest so weit ich es sagen kann, mit einem einfachen Ansatz. Sie könnten Ihr Programm die veraltete Eingabe in stdin eingeben lassen, so dass Ihr Programm den Eindruck hat, dass es Benutzereingaben liest. Falls der Benutzer jedoch tatsächlich neue Eingaben eingibt, sollte Ihr Programm diesen Fall sorgfältig behandeln.

+0

Ja, aber drucken Sie es wann? Wenn Sie blockiert sind und auf Eingabe von stdin warten, tun Sie nicht jede Sekunde etwas. –

+0

Genau @BoundaryImposition, da seine Funktion 'getchar()' hat, wird es immer hängen bleiben! – gsamaras

+0

Vielen Dank für Ihre Hilfe. Ich habe jetzt eine Lösung, in meinem Post bearbeitet. – Fleksiu

0

Sie können Setup SIGALARM Handler Setup Alarm nach x Sekunden und zeigen, was getchar kehrt in Handler

Verwandte Themen