每隔x秒显示不同输出的内容

时间:2017-05-06 16:06:53

标签: c while-loop ascii

我想输出我按下的最后一个键的ASCII代码,每隔x秒。

例如:

如果按a(97),终端应每隔x秒显示97。当我现在按下w(119)时,程序现在应该打印119而不是97。 到目前为止,我的程序只打印了我按下的第一个键。

以下是主要方法和其他方法:

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

2 个答案:

答案 0 :(得分: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()等待用户的输入?

因此,我会说,至少据我所知,你不能用一种简单的方法做你想做的事。你可以让你的程序将stale的输入提供给stdin,这样你的程序就会看到它读取用户的输入。但是,如果用户实际输入新输入,您的程序应该仔细处理该情况。

答案 1 :(得分:0)

您可以设置SIGALARM处理程序,在x秒后设置警报并显示处理程序

中返回的getchar