我想输出我按下的最后一个键的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();
}
答案 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