【问题标题】:If I input a float number when input is expecting an integer number, it updates the next float number value. Why does that happen?如果我在输入需要整数时输入浮点数,它会更新下一个浮点数值。为什么会这样?
【发布时间】:2020-08-23 14:54:54
【问题描述】:

我是 C++ 编程的新手。所以,我只是在尝试一些基本的 C++ 编码,并编写了以下程序:

#include <iostream>

using namespace std;

int main()
{
    int number1;
    float number2;

    cout << "Enter number1 (integer)\r\n";
    cin >> number1;
    cout << "Enter number2 (float)\r\n";
    cin >> number2;

    cout << "Number1 is "<<number1<<"Number2 is "<<number2<<endl;
    return 0;
}

当我执行上面的代码并错误地给出一个像“20.7”这样的数字而不是它在提示输入 number1 时所期望的整数时,

第二个 cin 语句被跳过,数字 1 打印为 20,数字 2 打印为 0.7。

这是为什么呢?我的期望是第一个 cin 应该将 20.7 设为 20 并将其存储在 number1 中,第二个 cin 不应该被跳过并提示我输入。

这是错误的期望吗?为什么会这样?

【问题讨论】:

  • 我认为标准输入会消耗整数所需的内容,然后将其余字符串放回输入中以供下次使用。
  • 为什么你认为程序应该跳过输入?如果你想了解事情是如何工作的,你应该阅读一些文档而不是做出假设。如果你只是假设,你会反复出错。
  • 您跳过了一个基本概念。您确实输入浮点数。您输入了输入代码试图解释的 text。如果文本可以解释为整数值,则代码会执行此操作。之后剩下的任何文本都将用于下一个输入。

标签: c++ floating-point integer


【解决方案1】:

您将浮点数传递给intcin 一看到“.”就停止阅读。剩下的数字 7 会自动作为下一个cin 的输入。

如果您认为值可能与预期类型不匹配,您可能希望在每次读取后刷新输入缓冲区。

std::cin.clear();std::cin.ignore(100,'\n')

应该是

std::cin.clear();
std::cin.ignore(whatever_num,'\n');

更多信息可以在herehere找到

编辑,看在皮特的份上:

  1. &gt;&gt; 流操作员是罪魁祸首。
  2. 所有输入均为文本。
  3. 在最好的情况下,将输入读取为 TEXT,然后对其进行解析/执行任何操作。
  4. 避免使用 cin.clear() 和 cin.ignore()。

【讨论】:

  • cin.clear() 与“刷新输入缓冲区”无关。
  • 它明确没有,但它应该与 fflush 或 cin.ignore 结合使用,更新了我的答案。
  • 当您想使用ignore 没有字符限制时,请使用std::numeric_limits&lt;std::streamsize&gt;::max() 而不是任意幻数。
  • 您好,感谢您的意见。使用 cin.ignore 后,我可以看到我可以忽略第一个输入的其余部分。
  • 不,cin 不会做任何事情。 流提取器 (operator &gt;&gt;) 读取文本 并对其进行解释。输入中的 text 可以解释为整数值,当 stream extractor 看到不能是整数的一部分时,它会停止读取。特别是,“您将浮点数传递给 int”是完全错误的。 text 可以解释为浮点值,但这也意味着 text 的初始部分可以解释为整数值,这就是流提取器可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 2021-05-14
  • 2018-07-22
  • 2019-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多