我是C ++的新手,我正在尝试编写一个非常基本的程序,但我遇到了初始化整数的问题。我把它剥离到一个仍然存在问题的非常小的程序:
#include <iostream>
using namespace std;
int main()
{
cout << "Please enter your age\n";
int age = -1;
cin >> age;
cout <<"\n\n Your age is " << age << "\n\n";
}
我读过如果我尝试输入字符串,例如对abc
变量age
,输入应该失败,值应该保持不变,因此应该打印Your age is -1
。
但是,当我运行此程序并输入abc
时,它会打印Your age is 0
。为什么呢?
答案 0 :(得分:33)
您希望观察的行为在2011年发生了变化。在此之前:
如果提取失败(例如,如果输入了预期数字的字母),则值保持不变,并设置failbit。
但是从C ++ 11开始:
如果提取失败,则将零写入值并设置failbit。 [...]
(来自cppr。)
答案 1 :(得分:4)
使用我测试的编译器(gcc 4.8.4),无论我编译的标准版本是什么,该值都设置为零(对于&#39; abc&#39;输入)。另请注意,如果您提供的有效整数超出了您指定的变量的受支持范围,则将其设置为最小值/最大值。
更重要的一点是,忽略错误标志是灾难的一种方法。一旦输入中出现错误,任何后续输入都是可疑的(没有像ignore()这样的黑客)。像这样的情况是使用异常处理的好选择。
这里是我如何实现你想要做的事情(但是,考虑到多个输入的情况,从错误中恢复是一件混乱的事情):
cin.exceptions( ~std::ios::goodbit );
try { cin >> age; }
catch ( std::ios::failure const & )
{
age=-1;
cin.clear();
cin.ignore(999,'\n');
}
或没有exeptions:
cin >> age;
if ( cin.fail() ) age=-1, cin.clear(), cin.ignore(999,'\n');
请点击此处查看类似问题:
以下是有关运营商的最新文档: