我正在编写一个显示对话框的简单通用函数。我打算在我的代码中从不同的地方调用它。问题是我需要在函数开头清除输入缓冲区,因此前一个输入的延迟数据不会被解释为答案。
这必须是一个非常普遍的想法,所以我相信C ++标准库提供了一些功能。但是,我没有找到它的运气。
这是我想要完成的一个实际例子:
#include <iostream>
#include <string>
unsigned dialog(const char question[], const char answers[])
{
//TODO reset std::cin
while (true)
{
std::cout << question << " [";
for (unsigned i = 0; answers[i] != '\0'; ++i)
{
if (i != 0)
std::cout << '/';
std::cout << answers[i];
}
std::cout << ']' << std::endl;
std::string line;
std::getline(std::cin, line);
if (line.empty())
{
for (unsigned i = 0; answers[i] != '\0'; ++i)
if (answers[i] >= 'A' && answers[i] <= 'Z')
return i;
} else if (line.length() == 1)
{
const char answer = toupper(line[0]);
for (unsigned i = 0; answers[i] != '\0'; ++i)
if (answer == toupper(answers[i]))
return i;
}
}
}
int main()
{
// --- optional part ---
std::cout << "Write something to clutter the input buffer..." << std::endl;
std::string foo;
std::cin >> foo; //User enters "aaa bbb ccc"
// --- optional part end ---
return dialog("Do you like this question?", "Yn");
}
与this other similar question不同,我正在寻找一些便携式解决方案。它应该至少在Windows和任何Linux系统中得到支持。
还有this question与我的非常相似。但是,所有答案似乎都假设输入缓冲区此刻不为空。如果我把它放在我的对话框之前并且此时输入是空的(例如直接在程序启动之后),则会导致用户需要按Enter以在屏幕上显示我的对话框的情况。该问题的一些答案不假设缓冲区不为空,基于依赖于标准库实现的函数。