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

2024-01-23

我有以下代码:

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


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

在第一种情况下,第一个值被完全读取,然后读取留下小数点.以及其后的所有未读内容。但是,读取均成功。

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

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

通过覆盖相应的do_get()的成员std::num_get<...>方面并安装std::locale在找到预期失败案例之一时失败的对象int可能会失败。不过,我怀疑这比这里合理的要复杂一些。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 cin 将我的双精度输入转换为整数? C++ 的相关文章

随机推荐

  • 使用 jQuery 调用 Sinatra 删除路由

    我对 Sinatra 还很陌生 正在制作一个利用基本 CRUD 功能的简单待办事项应用程序 在后端 我有工作路线并测试了所有内容 我想合并一些前端功能 并决定使用 jQuery 来帮助实现这一点 我在 jQuery 中有一段当前代码 当单击
  • 具有自定义对象的可过滤适配器

    我想将自动完成文本框添加到 xamarin android 中的列表视图 自定义对象 中 我有一个列表视图 它是从字符串数组填充的 我想使用自定义对象填充我的列表视图 下面的代码适用于字符串数组 任何帮助实现我的自定义对象适配器都会有所帮助
  • 如何更改两层的 ggplot 图例标签和名称?

    我正在使用 ggmap 和 ggplot 包绘制圣保罗地图中两个不同数据帧的经度和纬度坐标 并希望手动标记每个图例图层 更新 我编辑了下面的代码以使其完全可重现 我使用的是地理编码函数而不是 get map 更新 我想在不合并数据帧的情况下
  • addTooltip 间歇性地使用observeEvent 中的两个输入

    我正在构建一个闪亮的应用程序来绘制网络 用户可以选择一个节点 单击切换按钮以显示该节点的自我网络 然后单击相同的按钮返回主网络 我试图获得一个工具提示 将鼠标悬停在按钮上 其中的文本会根据按钮本身的状态以及是否选择节点而变化 问题是工具提示
  • Google Apps 脚本:一天内调用服务次数过多:电子邮件

    我正在尝试循环浏览电子表格 并为每一行发送一封电子邮件 电子邮件发送后 我想删除该行 然而那是行不通的 由于某种原因 它开始疯狂地发送电子邮件 并在某个时候达到限制并退出 它实际上只删除一行 请参阅下面的代码 function sendEm
  • Fortran 与 C++ 相比,如今 Fortran 在数值分析方面是否仍然具有优势? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 随着C 编译器 尤其是intel编译器 的快速发展 以及在C C 代码中直接应用SIMD函数的能力 Fortran在数值计算领域是否仍然具有真正
  • 如何在 App.config 中设置 SQLCommandTimeout

    我已经使用 SQL 数据库开发了一个 Window 服务 目前我的数据库中充满了记录 因此查询执行需要很长时间 而默认命令超时为 30S 但我想将其增加到 120S 一个选项是 com CommandTimeout 120 但我的应用程序中
  • Java 方法中的动态返回类型

    我在这里多次看到类似的问题 但有一个很大的区别 在其他问题中 返回类型由参数确定 我想要 需要做的是通过解析的值确定返回类型byte 根据我收集的信息 以下方法可能有效 public Comparable getParam String p
  • 为什么 _mm_stream_ps 会产生 L1/LL 缓存未命中?

    我正在尝试优化计算密集型算法 但遇到了一些缓存问题 我有一个巨大的缓冲区 它偶尔会随机写入 并且在应用程序结束时只读取一次 显然 写入缓冲区会产生大量缓存未命中 并且还会污染随后再次需要进行计算的缓存 我尝试使用非时间移动内在函数 但缓存未
  • Chrome 中页面加载时的 Popstate

    我正在为我的网络应用程序使用 History API 但遇到一个问题 我执行 Ajax 调用来更新页面上的一些结果并使用history pushState 为了更新浏览器的地址栏而不重新加载页面 然后 当然 我用window popstat
  • Javascript / jQuery - 点击 iPhone 上的元素外部

    我在这个问题中找到了一个关于检测 div 外部点击的很好的答案 如何检测元素外部的点击 https stackoverflow com questions 152975 how to detect a click outside an el
  • 使用之间的区别?和 :prepare 语句中的参数

    假设我想选择记录Id 30 准备好的语句允许两种绑定参数的方式 问号 id 30 q conn gt prepare SELECT FROM pdo db WHERE id gt q gt execute array id Here abo
  • 子div比父div大

    计划是使子 div 与父 div 中的空间一样大 是否可以选择将父级 div 的完整高度应用到子元素上 我只知道 css calc 作为一个选项 但我不想实现这个选项 另外我在图像中解释了这个问题 parent height 250px w
  • Firefox 配置文件首选项 vs Chrome 选项 vs IE 所需功能

    我已经看到 并且实际上回答了 几个特定于硒的问题 其中需要设置一些特定的浏览器首选项来更改其行为 例如 如何使用 Selenium 处理证书 https stackoverflow com questions 24507078 how to
  • Django - 生产中的内存中的sqlite

    我有一个在生产中使用的小型 10MB 只读 sqlite3 数据库 我想加快我的网站速度 因此我尝试在每次 Django 启动时将整个数据库从磁盘加载到内存 这个答案解释了如何在烧瓶中做到这一点 https stackoverflow co
  • 如何创建全局枚举

    如何通过所有类访问枚举 让我解释 enum BottomBackButtonNav 0 BottomNextButtonNav BottomSliderIncreaseNav BottomSliderDcreaseNav PageSwipe
  • 量角器新手,收集选择选项有困难

    自学量角器和解决非角度网络应用程序的问题 并从选择控件中获取所有值的列表 这是 html 但似乎无法验证列表 本网站的第一个重量选择框 http halls md body surface area bsa htm http halls m
  • 在 Python 中定义异常的“正确”方法,PyLint 不会抱怨

    我试图在 Python 2 6 中定义我自己的 非常简单的 异常类 但无论我怎么做 我都会收到一些警告 首先 最简单的方法 class MyException Exception pass 这有效 但在运行时打印出警告 Deprecatio
  • 如何从图像中检测机器人方向?

    我正在开发可以在玉米植株中运行并由罗盘传感器引导的机器人 但我想将相机用作机器人的眼睛 并使用图像处理来检测运动的误差角度 这是图像示例 processed image raw image segmented image 我使用以下步骤 步
  • 为什么 cin 将我的双精度输入转换为整数? C++

    我有以下代码 int variable 1 variable 2 cout lt lt Please enter the 2 numbers try if cin gt gt variable 1 throw Invalid number