c++ - 当用户为 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++11 之前,如果提取失败,operator>>
提取整数的默认行为是保持不变。
在 C++11 中,此行为已更改为在提取失败时将 0 存储到整数中。
我不知道为什么要进行更改,但我的猜测是它可以防止人们留下未初始化的变量,然后在使用该变量之前不检查提取是否成功。
不幸的是,格式化输入背后的机制相当冗长,但精简版是调用最终归结num_get::get()
为指定此行为的地方。1
1:为了您的兴趣,也可以附加一个不同的方面以供格式化输入使用,这意味着您可以指定您想要的任何失败行为。
推荐阅读
- python - 使用python读取多行不同数据类型
- azure - 获取 ADLS 目录和子目录路径,直到它使用 databricks 获取表中的文件格式
- canvasjs - 如何在canvasjs中禁用金字塔图的扩展区域
- google-apps-script - 如何执行 Google Add-on 自动部署/发布?
- zlib - 多线程压缩、随机访问和即时读取
- r - 了解 lapply 和 future.apply 以获得更快的循环?
- python - 如何在 MySQL 中更新 django 数据库模型?
- sql - Postgres - 如何修复 LATERAL 查询错误
- java - Spark Java中的内部连接
- ruby-on-rails - 如何将本地存储(活动存储)迁移到谷歌云存储