【问题标题】:Why is integer output 0 when collecting string from input为什么从输入收集字符串时整数输出为0
【发布时间】:2018-07-21 07:47:58
【问题描述】:

我是 C++ 新手,正在研究 Stroustrup 的编程原则和实践。在第 3.3 节中,他给出了以下示例:

#include <iostream>
#include <string>

int main() {
  std::cout << "Please enter your first name and age\n";
  std::string firstName;
  int age;
  std::cin >> firstName >> age;
  std::cout << "Hello, " << firstName << " (age " << age << ")\n";
}

根据文本,我输入了“22 Carlos”并期望输出为 22,后跟一些随机数或 0。好吧,我得到 0。

然后我初始化变量并输入相同的“22 Carlos”:

string firstName = "???";
int age = -1;

我希望输出是“你好,22 岁(年龄 -1)”,如文本中所述,而是得到“你好,22 岁(0 岁)”。为什么?

【问题讨论】:

  • 因为您的 STL 的 operator&gt;&gt; 实现显式将无效的 int 输入设置为 0。这是允许的,尽管行为在 C++11 之前未定义,但在 C++11 和稍后。
  • 只需检查如何从无效输入导致的流失败状态中恢复。
  • @πάνταῥεῖ 这不是链接中的重复问题。我在问为什么这本书和实际输出之间存在差异,链接的问题是询问是否有人使用提取运算符。完全不同。
  • 将这个问题作为副本关闭的人没有阅读副本的答案,因为没有人回答这个问题。所以我重新提出这个问题。
  • 在这里提问之前可以随时参考documentation,对不起。

标签: c++ std stdin cin stdstring


【解决方案1】:

您将age 设置为0 的原因是because(假设您使用的是c++11 或更高版本):

如果提取失败(例如,如果在数字所在的位置输入了字母 预期),值保持不变并设置故障位。 (直到 C++11)

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

顺便说一句,VC++ 编译器直到最近才遵循这个标准https://developercommunity.visualstudio.com/content/problem/285201/the-value-is-not-zeroed-after-failure-but-it-shoul.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 2014-06-21
    相关资源
    最近更新 更多