正在按照Bjarne Stroustrup的 "Programming Principles and Practice Using C++"一书,从最基础的知识开始学习C++。一切都证明是好的,直到发生了这样的事情......。
int main()
{
cout << "Please enter your first name and age\n";
string first_name = "???"; // string variable
int age = -1; // integer variable
cin >> first_name >> age; // read a string and then integer
cout << "Hello, " << first_name << " (age " << age << ")\n";
}
现在,正如上面的代码 (在第2章输入和类型部分) 建议,它输出了一个字符串,让我们熟悉了 名称 和 年龄 的人。由于我已经初始化了 整数变量 年龄 到 -1,程序必须返回 -1 如果我不小心输入了错误的信息,我就会将该信息发送到显示器上。串值 变成 年龄. 问题是,在我的电脑中,它不会发生。我试着编译并运行了19次程序(我确实记得......),但结果总是一样:它输出的是 0而不是-1.
例如,如果我输入 ABCXYZ 16
,然后输出将是一个漂亮而简单的 你好,ABCXYZ(16岁). 但如果输入的是 16 ABCXYZ
,那么输出的结果是 你好,ABCXYZ(0岁)我以为会是 你好,ABCXYZ(年龄 -1) 作为字符串 ABCXYZ
不读 年龄 (它是一个 整数变量),从而给出初始化的值,因为它没有被覆盖。
有什么办法吗?
P.S.: 我使用的是 GCC - 8.1.0 的 Code:Blocks。
std::istream& operator>>(int &value)
调用 std::num_get::get()
内部。从 cppreference std::num_get::get() 行为在c++11中发生了变化。
有了 v
来表示我们读入的变量,在c++11之前,我们有。
- 如果发生错误,v将保持不变。
然而自从c++11之后。
如果转换函数没有转换整个字段,那么0的值就会被存储在v中。
如果转换函数的结果是正值或负值过大,无法适应v这个有符号整数类型,则将最正或最负的可表示值分别存储在v中。
如果转换函数的结果是一个不适合v这个无符号整数类型的值,那么最正的可表示值就会被存储在v中。
你正在使用编译器和C++标准库进行编译,并将其配置为与c++11之后的标准兼容,所以当 std::cin
未能读取该字段,则 0
被存储到 age
.
该问题仅涉及以下方面: >>
操作符,它无法将你的字符串输入转换为整数(这是预期的,如 std::cin >> x
处理预期的输入,来自你为 x
),因此不管你用什么值来初始化这个整数变量,都会返回一个0。
正如Kamil所提到的,从C++ 11开始就这样做了,按照以前的标准,这个值会保持不变,并且对你的情况会返回一个-1。
你可以检查 cin
失败或通过,自己得出结论。
int main()
{
int age = -1;
std::cin >> age;
if(cin)
std::cout << age;
}
如果你输入了一个整数(从类型上看,你的输入应该是整数) age
)你会得到你初始化的年龄值的输出,否则如果你输入一个字符串,cin会失败(它的failbit会被触发,导致false),按照上面的if-statement,什么都不会显示。