c++ - 当用户为 int 变量输入字符串时输出

标签 c++ input user-input

我目前正在阅读 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)。 这是我得到的输出的屏幕截图 - output image from terminal . 而且,这是我正在使用的编译器版本 - compiler-version .

谁能解释为什么我没有像书中所说的那样得到 -1 作为年龄输出?

最佳答案

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

在 C++11 之前,operator>> 提取整数的默认行为是 leave it unchanged如果提取失败。

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

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

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

1:为了您的利益,也可以attach a different facet用于改为使用格式化输入,这意味着您可以指定任何您想要的失败行为。

关于c++ - 当用户为 int 变量输入字符串时输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56087461/

相关文章:

c++ - ScrollWheel 没有生成任何事件 - GLUT

c++ - 如何通过其他类打开和关闭mfc gui?

javascript - 如何使用脚本打开文件对话框或浏览文件窗口?

android - 以编程方式获取用于文本输入的不同键盘

swift - 你如何添加评分功能并允许用户在 Xcode 游戏中输入他们的名字?

c++ - 递归函数,用于查找输入数组中的数字子集是否可以加起来达到给定的目标值

c++ - 与旧版本的 libstdc++ 链接

javascript - 检查JS中是否有任何键按下

python - try catch raw_input 以供稍后使用

c++ - 如何读取未知数量的输入?