【问题标题】:C++ cin reading string into int type returns 0 [duplicate]C ++ cin将字符串读入int类型返回0 [重复]
【发布时间】:2017-03-28 21:11:03
【问题描述】:
#include <iostream>
using namespace std;
int main()
{
    cout << "Please enter your name and age\n";
    string first_name;
    int age;
    cin >> first_name;
    cin >> age;
    cout << "Hello, " << first_name << " (age " << age << ")!\n";
}

如果我为age 或任何其他字符串输入Carlos,我会得到0。这是如何工作的(为什么)?

【问题讨论】:

  • 你在学习的哪本 C++ 教科书没有详细解释这一点?
  • 肯定不是“任何其他字符串”。如果你输入 42,你会得到 42。
  • 为什么这样有效是什么意思?您正在输入一个字符串,但将其读入一个 int。最好的猜测是忽略您的输入,因为它与类型不匹配并返回一些默认值 (0)。注意 int age 不会将年龄初始化为任何默认值。
  • 哈哈@那些不知道这是怎么回事的人,对别人居高临下

标签: c++


【解决方案1】:

不知道为什么这个问题得到了反对/接近投票,因为它已经明确说明并且不广泛(并且从 cmets 判断,很多人不知道答案)...

无论如何,对于代码:

int age;
cin >> age;

如果输入流不包含任何数字,则将流置于失败状态并将age 设置为0。输入流中的字符保留在那里;一旦失败状态被清除,它们就可以被未来的读取操作读取。

operator&gt;&gt; 的行为是 summarized on cppreference ,标准中的完整描述有些复杂。

注意:这在 C++11 中有所改变;报告垃圾输出的评论员要么是在 C++11 之前的模式下运行编译器,要么是有错误的编译器。

【讨论】:

  • 非常有用的答案。
  • 帮助!您如何撤消此错误的影响?我尝试做 cin.clear() 但这没有任何作用,std::cin &gt;&gt; rounds 继续将 rounds 设置为 0。
  • @chbchb55 如果流上有非数字数据,那么这是正确的行为。您的意思是要从流中清除非数字数据吗? (如果是,see here)。
  • 谢谢,我自己早早就想出了如何做到这一点,我只需要忽略直到 EOL 而不是 EOF
【解决方案2】:

如果输入无法转换为int(在您的情况下),则failbit 将设置为std::cin。这可以通过调用std::cin.fail() 来检索。

 std::cin >> age;
 if (std::cin.fail()) { 
     std::cout << "data entered is not of int type"; 
 }

您也可以使用!std::cin 代替std::cin.fail()

【讨论】:

  • 我想知道0是垃圾还是&gt;&gt;在失败时将参数设置为它。
  • @Holyblackcat 垃圾。
  • 吉尔你确定吗?
  • "如果提取失败(例如,如果在需要数字的地方输入了字母),则值保持不变并设置失败位。".
  • 在 C++11 中更改为 0。以前它是垃圾。好吧,在这种情况下是垃圾。未修改我认为是正确的措辞。
猜你喜欢
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
相关资源
最近更新 更多