我有一个C ++控制台应用程序,它通过显示菜单然后对其进行操作来从用户获取输入。当用户输入整数值但当用户输入'?'(我想将其作为'显示帮助'选项处理)时,一切正常工作,代码开始无限循环并且不会阻塞std::cin>>
致电。这是预期的吗?我在这里缺少什么?
int queryAction()
{
while(1) {
char selection;
std::cout << "Action: ";
std::cin >> selection;
switch(selection)
{
//Some code that acts on the selection
...
}
}
}
跟进:
如果我在致电std::cin.clear()
之前添加cin>>
,那么一切都很好。我想我的后续问题是为什么在输入上设置的错误状态应该是一个有效的ascii字符?
答案 0 :(得分:3)
您永远不会检查阅读是否成功。任何编程的基本部分都是正确的错误处理。如果无法从流中读取std::cin >> selection;
,则会char
失败;如果到达源的末尾,则设置eofbit
。
检查此方法的一种简单方法是使用以下内容:
if (!(std::cin >> selection)) // Check if operation failed
{
std::cout << "Failed to read!\n"; // Notify user
std::cin.clear(); // Reset stream
// Ignore rest of line
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}