为什么cin会将我的双输入转换为整数?C++
Why does it look like that cin converts my double input into integer? C++
我有以下代码:
//...
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
的读取失败。不过,我怀疑这比这里的合理情况要复杂一些。
相关文章:
- 努力将整数转换为链表。不知道我在这里做错了什么
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 如何在C++中将整数转换为其数字数组
- 尝试将字符串/字符转换为整数会产生意外结果
- 如何使用C++将字符串中的字符转换为整数变量
- 如何将整数字符串转换为整数的二维向量?
- 如果整数与指针大小相同,则重新解释将整数转换为指针双射是否具有双射作用?
- 使用 "stringstream " 将字符串转换为整数
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 如何检测 std::vector::emplace_back 上的隐式转换损失整数精度
- 如何防止双精度值到整数的隐式转换
- 为什么此指针值不能转换为整数的规则是什么?
- 如何解决隐式转换丢失整数精度:'size_t'(又名"无符号长")到'int'警告?
- 在 C++ 中将整数数组转换为位集表示形式的最佳方法?
- 为什么在将 void 指针转换为整数指针时出现分段错误
- 将字符串(可以是十进制字符串或十六进制字符串)转换为整数C++
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- 如何使用 STL 算法将整数向量转换为字符串向量?
- 无法将"整数 (*)[m]"转换为"整数 (*)[100000]
- 静态强制转换允许转换对象指针,但不允许转换整数