2017-05-06 6 views
0

마지막으로 누른 키의 ASCII 코드를 매 x 초마다 출력하려고합니다. 예로서x 초마다 서로 다른 출력으로 표시

는 :

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

편집 : 여기

주와 다른 방법입니다 지금했습니다 시험의 약간 내 문제를 해결하는 방법으로

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'는 정확히 하나 개의 문자를 기다립니다 '때문이다 처리기에서 수익을 getchar가 무엇인지 표시; 대신에'read'를 사용해야합니다. –

답변

0

getchar()하나만 문자를 기다립니다. 따라서

while(1){ 
    movePlayer(); // getchar() and printf() here 
    fflush(stdout); 
    sleep(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 초 후