CIN为什么将浮动值分为两个部分

Why will cin split a floating value into two parts?

本文关键字:两个 CIN 为什么      更新时间:2023-10-16

我对Cin

有问题
int main(void)
{
    int a;
    float b;
    cin >> a >> b;
}

当我将浮动号(例如3.14)作为输入时, ab均未获取完整值(3.14):输出为a = 3,b = 0.14。

我知道cin会按空格,选项卡或返回将输入分开,但是"点"不会,对吗?

为什么以下代码可以工作?

int main(void)
{
    int i=0;
    int k=0;
    float j=0;
    cin >> i >> k >> j;    // i =3, j=k=0
}

还有一个问题,编译器将为我们做什么好处?

谢谢!

您已声明aint类型,在这种情况下,您希望它能与"。?

失败限制所获得的输入不能解释为 适当的类型。请注意,某些EOFBIT案件也将设置 失败。

其他提到的您效果很好,您问的问题是什么?您已经cin ED 3变量您期望在这里有什么期望?0对于float或int。

有效
cin >> a >> b;

给出了3.14的输入,这是点(周期)上的第一个解析,因为点不适合整数的语法。第二个解析以.14的方式拾取,这很好。

cin >> i >> k >> j;

这是有问题的,输入为3.14。第一个解析再次停在点上。第二个解析无法与点重新启动,因此将输入流标记为失败。

在执行I/O。

时始终检查状态

格式的输入函数的工作非常简单:

  1. 他们跳过领先的空格(如果有)。
  2. 他们尝试读取与给定类型匹配的格式。
  3. 如果读取值失败,因为数据不匹配所需的格式,则它们设置了std::ios_base::failbit。如果读取失败,输入不应更改尝试读取的变量(标准输入运算符遵循此规则,但用户定义的输入操作员可能不会)。

您尝试阅读的第一个值是int。读取int意味着读取可选的前导符号,然后读取一系列数字(其中,取决于您的设置和给定的值,流可以读取八分或十六进制数,而不是十进制数字)。也就是说,int接收值3并在.的前面停止阅读。

根据您接下来阅读的内容,下一个读取失败或没有:

  • 在第一个代码中,您尝试读取以可选符号开头的浮点值,然后是可选的积分零件,然后是可选的数千个分隔器,然后是可选的分数零件,然后是可选指数。在积分或分数部分中,至少需要一个数字。在您的示例中,只有一千个分开的部分。
  • 在尝试读取整数时,找到了.,这不是int的有效部分,并且阅读失败。

尝试阅读值后,如果读取操作成功并报告潜在错误,则应始终尝试:

if (in >> value) {
    std::cout << "successfully read '" << value << "'n";
}
else {
    std::cerr << "failed to read a value from inputn";
}

请注意,在读取失败后,您也可能需要清理,例如,使用

in.clear();
in.ignore();

这首先清除了错误标志(没有此,该流将忽略任何进一步读取数据的尝试),然后忽略下一个字符。

cin正在读取输入" 3.14",然后要求将其放入整数,然后将其放入float中。

因此,cin开始阅读,找到" 3",然后找到"。这不是整数。将3存储到a中并继续。" .14"是有效的浮点,它将其放入b。

然后您要求阅读intintfloat。第二个整数不匹配,cin停止,但是它仅能工作才能正常工作。实际上,失败

编译器无法警告您您正在做某件不起作用的事情,因为输入在编译时不知道。