首页 > 解决方案 > 当用户为 int 变量输入字符串时输出

问题描述

我目前正在阅读 Stroustrup 关于 C++ 的书。在用户输入部分,它具有以下示例 -

#include <iostream>
#include <string>

using namespace std;

int main(){

    cout << "Please enter your first name and age:\n";
    string firstName = "???"; // "??? means don't know the name"

    int age = -1; // -1 means don't know the age

    cin >> firstName >> age;

    cout << "Hello " << firstName << " (age " << age << ")\n";
}

根据本书,我们初始化age变量,以便在输入失败时获得可预测的值。该示例说输入22 Carlos将产生Hello 22 (age -1).

我在文本编辑器(Sublime Text)中输入了相同的代码,但是当我使用上述输入运行代码时,我的年龄为 0(不是 -1)。这是我得到的输出的屏幕截图 - 来自终端的输出图像。而且,这是我正在使用的编译器版本 - compiler-version

任何人都可以解释为什么我没有得到 -1 作为年龄输出,正如这本书所声称的那样?

标签: c++inputuser-input

解决方案


简短的回答是,如果该书的版本超过几年,那么两者都是正确的。

在 C++11 之前,如果提取失败,operator>>提取整数的默认行为是保持不变。

在 C++11 中,此行为已更改为在提取失败时将 0 存储到整数中。

我不知道为什么要进行更改,但我的猜测是它可以防止人们留下未初始化的变量,然后在使用该变量之前不检查提取是否成功。

不幸的是,格式化输入背后的机制相当冗长,但精简版是调用最终归结num_get::get()为指定此行为的地方。1

1:为了您的兴趣,也可以附加一个不同的方面以供格式化输入使用,这意味着您可以指定您想要的任何失败行为。


推荐阅读