清除终端的额外输入

时间:2016-02-19 13:32:24

标签: c++ c++11

这是一个示例代码,展示了我面临的问题。

#include <iostream>
#include <string>
extern "C" {
#include <unistd.h>
}

int main()
{
    std::cout << "Making tests ready!" << std::endl;
    std::cout << "\nTo start out, Enter an integer: ";
    int a = 0;
    std::cin >> a;
    std::string input;
    sleep(3);       // what to do if user enters data during this?
    std::cout << "\n Now enter a string";
    std::getline(std::cin, input);
    std::cout << "\nHere are your values - " << a << " & " << input;
    return 0;
}

看到代码之间的sleep调用?当我的程序不接受任何输入时计算某些东西时,可以用稍长的延迟代替。现在,如果用户在此期间按下某些键,则{​​{1}}在下一行代码中捕获该输入。我知道这是默认行为,因为它应该捕获所提供的输入。

但我想要的是清除所有捕获的输入并从第15行开始新的std::getline(),这是在睡眠后立即进行的。我不知道描述这个的确切术语,否则我会用它。感谢你。

编辑:我已尝试在我的代码中使用std::cout << "\n Now enter a string";,但它要求输入然后丢弃它。

请注意我的英语,而不是母语。

1 个答案:

答案 0 :(得分:0)

阅读评论会让我觉得你无法真正解决这个问题(至少通过那里提出的方法)。无论如何都存在固有的竞争条件。请考虑以下几行:

sleep(3);       
// (*) <- Potential location 1.
std::cout << "\n Now enter a string";
// (**) <- Potential location 2.
std::getline(std::cin, input);

各种评论显示了一些(非常技术上称职的)方式来刷新标准输入。问题是,您不能将它们放在标有(*)(**)的位置。

  • 第一个位置 - 您以某种方式清除标准输入。现在你决定转移到下一行(std::cout << ...)了。当您这样做时,用户会输入更多输入。比赛!

  • 第二个位置 - 您打印出消息(std::cout << ...),然后继续清除标准输入。在您设法执行此操作之前,用户键入了某些内容。比赛!

在我看来,评论中描述的任何技术都需要锁定标准输入,我认为没有(标准)方法可以这样做。