【问题标题】:iostream input issueiostream 输入问题
【发布时间】:2014-03-11 11:44:21
【问题描述】:

当我们输入第一个值 y 作为浮点数时,例如2.0,它正在打印答案,不允许输入第二个值z。为什么?

#include <iostream>
#include <conio.h>
using namespace std;

int add(int x,int y)
{
    int result;
    result=x+y;
    return result;
}

int main()
{

    int x;
    int y;
    int z;
    cin>>y>>z;
    x=add(y,z);
    cout<<x;
    getch();
}

【问题讨论】:

  • cout and include

标签: c++ dev-c++


【解决方案1】:

从流中提取将尝试使用所有输入,只要它的格式对您要提取的类型有效。例如,使用此代码

int x, y;
cin >> x >> y;

这个输入:

123.456

它将在x 中读取 123 并完成。然后,它将尝试读取 ay 中的整数。由于123 已被提取,可用的第一个字符是'.'。这不是一个有效的整数,因此将在流上设置failbit 标志(您可以通过调用cin.fail() 来检查),并且所有进一步的提取都将失败,除非您通过调用cin.clear() 清除错误标志。

如何解决这个问题取决于您到底想做什么。你可以取双精度并检查它们的小数部分是否为 0。你可以取一整行输入,将其放入字符串流中,提取一个整数并检查流中是否有任何垃圾。

在任何情况下,检查提取是否成功!始终在某些布尔上下文中使用流提取

if (cin >> x) { // <-- implicit conversion of the stream to bool
    // ok, it's safe to use x
} else {
   // an error occured
}

至少明确检查错误:

cin >> x;
if (cin.fail()) { /* error */ }

【讨论】:

  • 但是为什么要提取'.'而不是要求输入新数字。实际上 123.456 应该被视为 123,然后其他值应该被丢弃,因为我听说当我们输入浮点值时,小数点后的数字被忽略,小数点前的数字被考虑。
  • 好吧,你听错了。流永远不会自动丢弃输入(如果没有其他原因,它无法读取程序员的想法)。你需要明确告诉它,检查函数ignore
【解决方案2】:

当您输入float value 时,例如2.0cin 贪婪地将输入中的数字分配给 y,此处为 2,然后查找第二个数字(不将 . 视为 y是integer)。因为它找到.,它终止并丢弃其余的输入。
编辑了您的代码,因为它包含语法错误。

#include<iostream>
using namespace std;

int add(int x,int y)
{
int result;
result=x+y;
return result;
}

int main()
{
int x,y,z;
cin>>y>>z;
x=add(y,z);
cout<<x;
return 0;
}

【讨论】:

  • 为此,变量应该是浮点数、双精度等。我已经编辑了答案。
  • 是的,我意识到 yz 是整数。
  • 请注意,“将 0 分配给 z”仅在 C++11 后才成立。在 C++03 中,z 的值将保持不变(在这里,它将保持未初始化)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 2020-06-27
  • 2012-06-15
  • 1970-01-01
相关资源
最近更新 更多