【问题标题】:Why does it look like that cin converts my double input into integer? C++为什么看起来 cin 将我的双输入转换为整数? C++
【发布时间】:2015-03-29 17:33:56
【问题描述】:

我有以下代码:

//...
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 integers\n"; return -1;}
//...

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

【问题讨论】:

  • 整数的提取在第一个非消耗字符处停止,这就是重点(也可以是任何非“整数字符”)。

标签: c++ int double cin


【解决方案1】:

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

在您的第一种情况下,第一个值被完全读取,然后读取留下小数点 . 以及后面的任何内容未读取。但是,读取都成功了。

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

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

通过覆盖std::num_get&lt;...&gt; facet 的相应do_get() 成员并安装std::locale 对象,该对象在找到预期的失败案例之一时失败,int 的读取可能会失败。不过,我怀疑这比这里的合理情况要复杂一些。

【讨论】:

  • 我想我明白了。所以基本上 cin 只要它得到一个整数,无论​​后面可能有什么字符,它都是成功的。该解决方案对我来说似乎有点太复杂了(我是 C++ 和一般编程的新手)。感谢您的帮助!
  • @Experimentgr:我建议只读取字符串,然后尝试使用各种字符串到 int 转换函数之一将它们转换(例如std::stoi,这将在失败时引发异常)跨度>
猜你喜欢
  • 2022-07-26
  • 2022-12-10
  • 2020-02-10
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 2018-09-13
  • 2012-07-21
  • 1970-01-01
相关资源
最近更新 更多