2017-05-05 66 views
3

所以这是一个非常基本的问题和超级微不足道的,但我只是通过编程原则&实践在c + +和我的程序阅读一个字符串和一个int是行为不同于Bjarne Stroustrup写的书,所以id很惊讶如果他犯了一个错误。反正这里的代码:cin在读取错误类型时覆盖我的初始化值?

#include "..\std_lib_facilities.h" 

int main() 
{ 
    cout << "Please enter your first name and age\n"; 
    string first_name = "???"; // string variable 
           // ("???” means “don’t know the name”) 
    int age = -1;    // integer variable (1 means “don’t know the age”) 
    cin >> first_name >> age; // read a string followed by an integer 
    cout << "Hello, " << first_name << " (age " << age << ")\n"; 
} 

当我输入“22·卡洛斯”成提示它输出终端“你好,22(0岁)”主要在做错误检查没用我的初始值。这是C++的一个新功能或什么,这就是为什么这本书是错的?

编辑1:在Windows 7上使用GCC for cygwin和-std = C++ 11触发器的BTW。

+0

我觉得老(前C + +11)行为对于一般类型(非内置类型)是不现实的。如果读取失败,恢复旧值是没有效率的,我认为将读取对象置于有效状态(不一定是原始值)会使实现输入流代码的工作变得更容易。 – alfC

回答

6

这是因为C++ 11的std::basic_istream::operator>>一个新的功能:

如果提取失败(例如,如果输入了字母,其中数字预计)值留未修饰的和failbit被设置。 (直到C++ 11)

如果提取失败,则将零写入值并设置失败位。 (自C++ 11以来)

您应该检查流的状态,例如,

if (cin >> age) { 
    ... fine .... 
} else { 
    ... fails ... 
}