如何丢弃睡眠功能期间传递的用户输入?

时间:2019-04-02 12:09:04

标签: c input stdin

我正在尝试使用终端创建游戏。我问播放器是否准备好,然后用下面的代码倒数。问题在于,用户所做的所有输入都会添加到程序进行的下一个输入查询中。我正在寻找一种方法来丢弃以前的输入或在此功能期间完全阻止它。

我可以进行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
}

3 个答案:

答案 0 :(得分:4)

您基本上不能; “在一定时间内舍弃用户输入”的概念对于标准输出和输入并没有任何意义,请考虑一下您的输入可能来自文件的事实(这里的问题是“时间”实际上不是标准的输入/输出例程中存在的任何概念。

您需要一个终端API,C标准库中没有类似的东西,尽管有些库提供了这样的功能(但是您已经说过,您不想使用外部库)。 / p>

答案 1 :(得分:1)

一种方法是使用线程进行倒计时。

主代码启动倒计时线程,然后循环获取输入。

如果输入函数在线程终止之前返回,或者输入了错误的答复,请忽略输入并重复循环。

答案 2 :(得分:0)

由于您使用的是Linux环境,因此可以尝试使用tcflush()

Link to tcflush documentation

这是使用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
}