为什么cin(期望一个int)在输入无效的情况下将相应的int变量更改为零?

时间:2015-09-03 14:48:11

标签: c++

我是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。为什么呢?

2 个答案:

答案 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');

请点击此处查看类似问题:

以下是有关运营商的最新文档: