我在 google/stackoverflow 上看到过类似的帖子。然而,我找不到一个足够接近我的场景的方法,而且我对 C/C++ 的了解也不够深,无法将其他建议移植到我的方法中。也许这本身就是一个标志......
无论如何,这是我的代码:
while (true)
{
print("\nSend message, enter command, or \"9\" for help.\n");
if (cin >> input)
{
if (input == TERMINAL_HELP)
{
//Some help code.
}
else if (input == TERMINAL_EXIT)
{
//Some exit code.
}
else if (input < 4 && input >= 0)
{
// Some processing code.
}
else
{
print("Please enter a valid message.");
}
}
else
{
print("Please enter a valid message.");
}
}
对于范围 [0-4] 之外的单个字符或整数,捕获效果很好。但当我把一根绳子放进去时,事情就变得很奇怪了。它不断地无限循环。然而,第一次之后这应该是不可能的,因为我没有按回车键。它继续下去,就好像它无限地接收空白。
如果您有任何建议或可以指出我解决问题的方向,我将不胜感激!谢谢!
NOTE:
我试图遵循这一点,并且在某种程度上起到了作用。 (我从这个链接的 if 语句想法中得到了 cin >> 输入...)但是它无法阻止字符串使程序奇怪地循环。
使用 cin - C++ 进行良好的输入验证循环 https://stackoverflow.com/questions/2075898/good-input-validation-loop-using-cin-c
只是为了让你开始做某事..
关键点:
- iostreams(包括cin)有一个叫做“错误标志”的东西
- 当错误发生时,流可以配置为 *) 引发异常 *) 跳过下一个操作
- 默认配置是..不抛出并跳过进一步的操作
这意味着,如果您这样做:
cin >> integer1;
cin >> integer2; // *!
cin >> integer3; // !
cin >> integer4; // !
如果用户在标有(*)的行处提供了一个非整数,那么此时cin将进入错误状态并进行标有(!)的操作将被跳过.
这很可能就是为什么你会出现奇怪的行为,例如无限读取循环等。
要处理这个问题:
- 配置流以引发异常 - 并捕获它们
- 或每隔几次读取后检查错误状态 - 并处理它们
i.e.
cin >> integer1; if(cin.fail()) { cout << "wtf?!"; cin.clear(); .. return; }
cin >> integer2; if(cin.fail()) { cout << "wtf?!"; cin.clear(); .. return; }
cin >> integer3; if(cin.fail()) { cout << "wtf?!"; cin.clear(); .. return; }
cin >> integer4; if(cin.fail()) { cout << "wtf?!"; cin.clear(); .. return; }
cin.reset
清除错误标志并允许对流进行进一步操作。然而,所有的垃圾数据仍会徘徊在溪流中。因此,尝试进一步阅读是没有意义的。在 cin.reset 之后,您应该以某种方式删除该坏数据并从这种情况中恢复。我用“..”标记了这些地方,因为有很多方法可以做到。
例如,cin.ignore..
现在请参阅所有其他帖子:)我相信您现在会很快找到解决方案
编辑:aargh..抱歉,我离实际答案太远了..你真正想要的不是一个好的错误处理,而是类似于sehe写道:您应该读取“字符串”,然后检查它,然后将它们重新解析为整数或将其视为字符串数据,而不是读取整数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)