这是一个示例代码,展示了我面临的问题。
#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";
,但它要求输入然后丢弃它。
请注意我的英语,而不是母语。
答案 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 << ...
),然后继续清除标准输入。在您设法执行此操作之前,用户键入了某些内容。比赛!
在我看来,评论中描述的任何技术都需要锁定标准输入,我认为没有(标准)方法可以这样做。