使用cin.fail();
的正确方法是什么?
我正在制作一个你需要输入内容的程序。您是否需要输入数字或字符并不十分清楚。当用户输入一个字符而不是一个数字时,控制台会发疯。如何使用cin.fail()
来解决此问题?
或者有更好的方法吗?
答案 0 :(得分:17)
std::cin.fail()
用于测试前面的输入
成功了。然而,使用它更加惯用
流,好像它是一个布尔值:
if ( std::cin ) {
// last input succeeded, i.e. !std::cin.fail()
}
if ( !std::cin ) {
// last input failed, i.e. std::cin.fail()
}
在输入语法允许数字的上下文中
一个字符,通常的解决方案是通过行(或在线)读取它
一些其他字符串形式),并解析它;当你发现它
有一个号码,您可以使用std::istringstream
来
转换它,或任何其他替代品(strtol
,或
std::stoi
如果你有C ++ 11)。
然而,可以直接从中提取数据 流:
bool isNumeric;
std::string stringValue;
double numericValue;
if ( std::cin >> numericValue ) {
isNumeric = true;
} else {
isNumeric = false;
std::cin.clear();
if ( !(std::cin >> stringValue) ) {
// Shouldn't get here.
}
}
答案 1 :(得分:8)
cin.fail()
返回true,否则返回false。
一个例子:
int main() {
int i, j = 0;
while (1) {
i++;
cin >> j;
if (cin.fail()) return 0;
cout << "Integer " << i << ": " << j << endl;
}
}
现在假设你有一个文本文件--input.txt,它的内容是:
30 40 50 60 70 -100 Fred 99 88 77 66
如果您将在上面执行短程序,则会产生如下结果:
Integer 1: 30
Integer 2: 40
Integer 3: 50
Integer 4: 60
Integer 5: 70
Integer 6: -100
在读取第七个字后退出后不会继续显示第6个值,因为这不是整数:cin.fail()
会返回true
。