Linux键盘输入是缓冲的,为了捕获动态命中的密钥,您必须配置TERM IO.
在main()顶部附近添加一个调用(参见下面的代码)
term_nonblocking();
读取即时按下的键,而不等待回车(CR).
码:
struct termios stdin_orig; // Structure to save parameters
void term_reset() {
tcsetattr(STDIN_FILENO,TCSANOW,&stdin_orig);
tcsetattr(STDIN_FILENO,TCSAFLUSH,&stdin_orig);
}
void term_nonblocking() {
struct termios newt;
tcgetattr(STDIN_FILENO,&stdin_orig);
fcntl(STDIN_FILENO,F_SETFL,O_NONBLOCK); // non-blocking
newt = stdin_orig;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO,&newt);
atexit(term_reset);
}
注意:当程序退出时,将自动调用term_reset()(重置终端参数).
您可以在程序中的任何位置调用现在非阻塞的getchar()来检测按键
int i = getchar();
并检查是否按下了某个键:
if (i > 0) {
// key was pressed,code in `i`
}
在您的程序中,例如:
int key = 0;
while (... && key <= 0) {
// ...
key = getchar();
}
注意:如果您希望输出无缓冲,请调用setbuf(stdout,NULL);
(来自@stacey的注释:当没有密钥可用时,getchar()可能返回0或-1)