我正在尝试使用终端创建游戏。我问播放器是否准备好,然后用下面的代码倒数。问题在于,用户所做的所有输入都会添加到程序进行的下一个输入查询中。我正在寻找一种方法来丢弃以前的输入或在此功能期间完全阻止它。
我可以进行getchar循环,但是倒计时(按Enter键)后,我不需要用户输入。
void countdown(void){
printf("5\n");
sleep(1);
printf("4\n");
sleep(1);
printf("3\n");
sleep(1);
printf("2\n");
sleep(1);
printf("1\n");
sleep(1);
clearScreen(0); //clears terminal
}
答案 0 :(得分:4)
您基本上不能; “在一定时间内舍弃用户输入”的概念对于标准输出和输入并没有任何意义,请考虑一下您的输入可能来自文件的事实(这里的问题是“时间”实际上不是标准的输入/输出例程中存在的任何概念。
您需要一个终端API,C标准库中没有类似的东西,尽管有些库提供了这样的功能(但是您已经说过,您不想使用外部库)。 / p>
答案 1 :(得分:1)
一种方法是使用线程进行倒计时。
主代码启动倒计时线程,然后循环获取输入。
如果输入函数在线程终止之前返回,或者输入了错误的答复,请忽略输入并重复循环。
答案 2 :(得分:0)
由于您使用的是Linux环境,因此可以尝试使用tcflush()
这是使用tcflush修改后的代码示例。您可以取消注释底部,并看到从倒数计时器缓冲区中清除了倒计时期间输入的所有内容。
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
void main(){
char str[100];
printf("5\n");
sleep(1);
printf("4\n");
sleep(1);
printf("3\n");
sleep(1);
printf("2\n");
sleep(1);
printf("1\n");
sleep(1);
// arguments for tcflush:
// 0 is for stdin
// TCIFLUSH is to flush data received but not read
tcflush(0,TCIFLUSH);
// prove it works by uncommenting this code
// printf("fgets is waiting");
// fgets(str, sizeof(str), stdin);
// printf("%s", str);
// clearScreen(0); //clears terminal
}