如何防止getch()获取过早输入的输入数据?

时间:2016-10-19 17:45:26

标签: c++

简单的代码来理解问题:

string op;
int main()
{
    cout<<"hi";
    op=getch(); // or cin>>op
    delay(2000) // delay for 2 sec.
    cout<<endl<<" bye";
    op=getch(); // or cin>>op
    system("cls"); 
    cout<<"  MAGIc !! !!";
    return 0;
}

此代码应该做的是:

  1. 打印“hi”
  2. 等待用户按任意键
  3. 等待两秒钟
  4. 打印“bye”
  5. 等待用户再次按任意键
  6. 清除屏幕
  7. 打印“魔术”
  8. 假设有两个用户:用户A和用户B.

    假设用户A按下'a'键然后等待两秒钟直到显示“再见”,然后再次按'a'然后看到屏幕清晰并且“魔术”被打印。用户A很好,没有问题。

    但让我们的用户B不耐烦。用户B看到“hi”并立即按两次'a'。然后两秒后,他只看到“魔术”这个词。他永远不会看到“再见”因为屏幕立即被清除了!

    所以问题是:如果一个不耐烦的用户在打印“再见”之前按下了太多的键,我该如何阻止第二个getch()获取输入,这样他们就必须在<<>之后按 打印“bye”并在之前清除屏幕?

1 个答案:

答案 0 :(得分:1)

抱歉太晚了。在你的情况下使用:FlushConsoleInputBuffer来清除getch缓冲区:

int main()
{
    cout<<"hi";
    op=getch();
    Delay(2000);
    cout<<endl<<" bye";

    FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)); // flushing the buffer
    op=getch(); // or cin>>op
    system("cls"); 
    cout<<"  MAGIc !! !!";
    return 0;
}

以上用户甚至可以输入4次,一切都会好起来。

  • 在不使用它的情况下清除cin的缓冲区真是太蠢了