如果用户不小心给出了错误的数据类型,cin 如何工作?

Ank*_*rma 3 c++ user-input cin

我是 C++ 的新手。我正在试验cin.

我想知道cin如果用户提供不正确的数据类型,将如何进行输入。所以我检查了 Stack Overflow 并得到了这个答案

当你读取一个整数并给它输入 1.5 时,它看到的是整数 1,它在句点处停止,因为它不是整数的一部分。“.5”仍在输入中。这就是你只得到整数部分的原因,这也是它似乎没有第二次等待输入的原因。

为了解决这个问题,您可以读取浮点数而不是整数,以便读取整个值,或者您可以检查读取整数后行中是否还有其他内容。

所以我尝试了它。

#include <iostream>

int main()
{
    std::cout << "Enter 4 numbers: " <<
    std::endl;
    int v1 = 0, v3 = 0;
    float v2 = 0, v4 = 0;
    std::cin >> v1 >> v2 >> v3 >> v4;
    std::cout  << "-> " << v1 << " " << v2 << " " 
    << v3 << " " << v4 << std::endl;    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
Enter 4 numbers:
3.14 2.718
-> 3 0.14 2 0.718
Run Code Online (Sandbox Code Playgroud)

它按预期工作。但是当我尝试

Enter 4 numbers:
3.14 2.718
-> 3 0.14 2 0.718
Run Code Online (Sandbox Code Playgroud)
Enter 3 numbers:
3.14
-> 3 0 0
Run Code Online (Sandbox Code Playgroud)

我期待,3 0 0.14因为3will v1as int0.14将在缓冲区中,所以当第二次>>遇到它时,它将分配0v2,第三次>>分配0.14v3asv3是一种类型float

请解释这个想法是如何工作的。

我在 Lenovo Ideapad S340 上使用了 G++ mingw 8.2.0 编译器

vll*_*vll 5

如果提取失败,则将零写入 value 并设置 failbit。

输入: 3.14

你读了一个整数。3被读取并.14保留在缓冲区中。

你读了另一个整数。.不是整数的一部分,因此不会读取任何内容并设置故障位

你读了一个浮动。没有读取任何内容,因为已经设置了故障位。