下午好!在 C++ 上做实验室工作时,我遇到了以下问题:
我有一个readCommand
读取命令的静态方法...并在成功输入后,将此命令传递给另一个方法choose(index)
...
一切正常,但有这样一个问题,当输入数字时,一切正常,工作..但是如果你不小心输入的不是数字,而是符号或字母,方法中的循环将无限运行......
这是代码:
static void readCommand(){
cout << endl <<"Select one: ";
while(true){
int index = 0;
cin >> index;
if(index < 1 || index > 4){
cout << endl << "INDEX UNDEFINED!" << endl;
cout << endl << "Select again: ";
} else{
choose(index);
break;
}
}
}
该程序的工作原理如下:
如何解决?作为 Java 鉴赏家,我知道您可以通过添加异常处理程序轻松避免这种情况。只有在 C++ 中我不知道该怎么做。
假设我们需要读取一个整数
如果用户输入了错误的内容,线程会将其状态从good更改为fail。你可以这样检查:
或者更短的符号:
现在如何处理这个问题:
就这样。添加此检查,一切都会起作用。也可以显示错误信息
http://cpp.sh/9by3m
问题是输入
gg
的不是预期的数字cin >> index
。这些字符保留在输入流中,并尝试在循环中再次读取它们。可能最简单的方法是在重试之前将所有数据读取到行尾。
请注意,在检测到错误后,cin 将处于不健康状态,必须从该状态退出。当然,我知道你有一个 C++ 实验室(甚至现在我会看到它是如何交叉完成的),但我真诚地建议你在实践中使用 C 输入输出工具(它更容易)。
这是一个有效的示例(即使在输入错误状态下也能处理 EOF)
C++ 有一个类
stringstream
. 要使用它,您需要添加#include <string>
和#include <sstream>
。以下代码使用其流执行安全数字输入。用于
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
在无效输入后刷新缓冲区...