【问题标题】:How internally string/char is stored in int and float内部字符串/字符如何存储在 int 和 float 中
【发布时间】:2017-03-04 18:30:22
【问题描述】:

错误地在执行以下代码块时发现了该场景

#include <iostream>
using namespace std;
int main()
{
    int input1;
    float input2;

    cout << "Enter a real number :";
    cin >> input1;
    cout << "The int number is " << input1 << endl;

    cout << "Enter another number :";
    cin >> input2;
    cout << "The float number is " << input2 << endl;
}

上面的输出是

Enter a real number :a
The int number is -858993460
Enter another number :a
The float number is -1.07374e+08

谁能解释一下如何在内部处理上述情况导致上述情况?

注意 -

  • 在 VS2015 中运行上述内容。

由于我是新尝试使用 C++,如果我在此过程中遗漏了任何参考资料,请指出我。

【问题讨论】:

  • 什么是input?它没有在您的示例中声明。
  • 你检查过失败位吗 - 它可能不是一个数字
  • @mpiatek 在两种情况下的输入都是'a',对于所有情况,int 和 float 的输出都是相同的,没有任何变化
  • @EdHeal 我不想做失败检查(我知道我应该做)。但我想知道这些相同的价值观是如何在内部产生的。

标签: c++


【解决方案1】:
int input1;
float input2;

此时,input1input2 都有未定义的值,因为您没有初始化它们。

std::cin 期望输入一个整数,但您输入了 'a',这使得 std::cin 变为 fail。该故障持续存在,因此在清除 failbit 之前,无法使用 std::cin 执行提取操作。

在输入操作失败后,input1input2 仍然“未定义”。打印它们会导致未定义的行为。

【讨论】:

  • 是的,你是对的,确实是正确的行为,我用 0 初始化它们,现在即使我输入错误,输出似乎也是正确的。感谢您的解释。我会接受这个作为答案。
  • cin&gt;&gt;input 之后使用if(!cin)cout&lt;&lt;"failed"; 来验证cin 确实失败了。
  • @GauravSehgal 感谢您的意见...正如您所说。
  • @sasuke,参见thisthis,以及std::cin 可以假设的states
  • 甚至if (cin &gt;&gt; input1)
【解决方案2】:

当流不能被解释为适当类型的有效值时,提取运算符不会更改变量。因此,您会看到 input1input2 的未初始化值。可以查看cin上的failbit,看看提取算子是否成功。

例如:

    int input1;
    cout << "Enter a real number :";
    cin >> input1;
    if(cin.good())
    {
        cout << "The int number is " << input1 << endl;
    }
    else
    {
       cout << "The input was not a number." << endl;

       // skip to the end of the input
       cin.clear();
       cin.ignore(INT_MAX, '\n');
    }

【讨论】:

  • 是的,也可以按照你这里的建议处理。感谢您的回复。
猜你喜欢
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 2020-10-03
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多