0

我有一个关于cin的问题。

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

当我给出一个浮点数(如 3.14)作为输入时,既没有a也没有b得到完整的值(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
}

还有一个问题,编译器这样做对我们有什么好处?

谢谢!

4

4 回答 4

4

您已声明a为 type int,在这种情况下,您希望它与“.”做什么?

failbit 获得的输入无法解释为适当类型的元素。请注意,某些 eofbit 案例也会设置 failbit。

你提到的另一个问题很好,你问的是什么问题?您已经cin编辑了 3 个变量,您在这里期望什么?0 对 float 或 int 有效。

于 2012-10-22T19:54:12.543 回答
2
cin >> a >> b;

给定输入 3.14,第一次解析点(句点),因为点不适合整数的语法。第二个解析使用 .14,解析得很好。

cin >> i >> k >> j;

这对于输入 3.14 是有问题的。第一次解析再次停在该点上。第二个解析不能以点重新开始,因此它将输入流标记为失败。

在执行 I/O 时始终检查状态。

于 2012-10-22T19:57:19.093 回答
1

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

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

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

根据您接下来阅读的内容,下一次阅读是否失败:

  • 在第一个代码中,您尝试读取以可选符号开头的浮点值,然后是可选的整数部分,然后是可选的千位分隔符,然后是可选的小数部分,然后是可选的指数。整数部分或小数部分至少需要一位数字。在您的示例中,只有数千个单独的后跟小数部分。
  • 尝试读取整数时,.发现 a 不是 a 的有效部分int并且读取失败。

尝试读取值后,应始终尝试读取操作是否成功并报告潜在错误:

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

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

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

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

于 2012-10-22T20:04:28.593 回答
1

cin正在读取输入“3.14”,您要求将其放入一个整数,然后放入一个浮点数。

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

然后你要求阅读int, int, float. 第二个整数不匹配并cin停止,但它似乎只是在工作。实际上,它失败了

编译器无法警告您正在执行的操作不起作用,因为在编译时输入是未知的。

于 2012-10-22T19:57:04.947 回答