为什么cin会将我的双输入转换为整数?C++

Why does it look like that cin converts my double input into integer? C++

本文关键字:转换 整数 C++ 输入 cin 我的 为什么      更新时间:2023-10-16

我有以下代码:

//...
int variable_1, variable_2;
cout << "Please enter the 2 numbers: ";
try
{   
    if ( !(cin >> variable_1) ) throw Invalid_number(); //empty class just for exceptions
    if ( !(cin >> variable_2) ) throw Invalid_number(); //problem is here.
}
catch (Invalid_number) {cerr << "You must enter integersn"; return -1;}
//...

因此,如果我为variable_1输入一个整数,为variable_2输入一个双精度,程序不会抛出异常,它只是继续执行程序的其余部分。从调试中我看到,当我输入一个双变量_2(即2.4)时,它只是将其转换为2,并且不会引发异常。相反,如果我为variable_1输入一个double,它会抛出异常,它被捕获,程序结束(返回-1)。有人知道为什么会发生这种情况吗?每次输入的两个数字中有一个不是int时,如何抛出异常?

当您使用std::istream读取int时,它首先跳过前导空格,然后尝试读取一个符号(如果没有,则假定为正数),然后是一系列数字。一旦没有更多的数字,它就会停止读取。如果至少可以读取一个数字,并且数字序列与符号组合产生值,则读取成功。否则读取失败。

在第一种情况下,第一个值被完全读取,然后是一个保留小数点.的读取,后面的任何内容都未读取。然而,这两次阅读都是成功的。

在第二种情况下,读取小数点之前的数字,将小数点留在流中。第二次读取尝试读取int,但未能找到小数点。

如果有其他事情发生,使读取失败有点棘手,因为不清楚哪些输入应该失败!您可以在阅读后检查下一个字符是否为预期字符,例如空白。。。或者你可以读取行的剩余部分,并验证它是否只包含空白:这将是在格式化和非格式化之间切换而不进行任何读取的罕见情况之一。

通过覆盖std::num_get<...>方面的相应do_get()成员并安装在发现预期故障情况之一时失败的std::locale对象,可以使int的读取失败。不过,我怀疑这比这里的合理情况要复杂一些。