首页 文章

为什么cin将浮动值分成两部分?

提问于
浏览
0

我有一个关于cin的问题 .

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

当我给出一个浮点数(例如3.14)作为输入时, ab 都没有得到完整值(3.14):输出是a = 3,b = 0.14 .

我知道 cin 会按空格,制表符或Return分割输入,但'dot'不会,对吧?

为什么以下代码有效?

int main(void)
{
    int i=0;
    int k=0;
    float j=0;

    cin >> i >> k >> j;    // i =3, j=k=0
}

还有一个问题,编译器会为我们带来什么好处呢?

谢谢!

4 回答

  • 1

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

    • 如果有的话,他们会跳过前导空格 .

    • 他们尝试读取与给定类型匹配的格式 .

    • 如果由于数据与所需格式不匹配而读取值失败,则会设置 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 input\n";
    }
    

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

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

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

  • 1

    你已声明 a 的类型是 int ,在这种情况下你对它有什么期望"."?

    failbit获取的输入无法解释为相应类型的元素 . 请注意,一些eofbit案例也会设置failbit .

    另一个提到你工作得很好你问的问题是什么?你有 cin ed 3变量你在这里期待什么? 0对float或int有效 .

  • 4
    cin >> a >> b;
    

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

    cin >> i >> k >> j;
    

    输入3.14时会出现问题 . 第一个解析再次停在点上 . 第二个解析无法使用点重新启动,因此它将输入流标记为失败 .

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

  • 2

    cin 正在读取输入"3.14"并要求将其放入整数然后浮点数 .

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

    然后你要求阅读 intintfloat . 第二个整数不匹配且 cin 停止,但它似乎只是起作用 . 实际上,它失败了 .

    编译器无法警告您正在执行无法正常工作的事情,因为输入在编译时是未知的 .

相关问题