C++中while循环中cin语句被跳过问题解析

2023-11-17

今天在写代码的时候,遇到了一个非常奇怪的问题

		while (true)
		{
			int select;
			cout << "请输入查找的方式:" << endl;
			cout << "1、按职工编号查找" << endl;
			cout << "2、按职工姓名查找" << endl;
			cin >> select;
			if (select == 1)
			{
				break;
			}
			if (select == 2)
			{
				break;
			}
			else
			{
				cout << "输入不合法!" << endl;
			}
		}

这段代码的本意是想要规范输入,提高容错率。但是当我输入一个字符比如’a’的时候,while循环中的cin语句将会被跳过,进入无限的死循环。上网查阅了很多资料,发现了问题所在

MSDN上cin的定义如下
这是MSDN上cin的定义
看不懂也没关系,以下为它的翻译

cin
该对象控制从标准输入中以字节流形式进行的提取。构造对象后,调用cin.tie()返回&cout。

因为cin是一个输入流,当要求给一个整型赋值的时候,输入的类型可能与该整型不匹配,导致缓存溢出。如果输入的过多了,那么,那些输入除了一部分赋值给变量以外还有剩余的字节,这些剩余的输入将残留在输入缓存中,就会导致在下面需要输入的时候不再接受输入,而直接从缓存中获得。

所以,出现这个问题后可行的解决方法如下:

一、更换被赋值整型的数据类型
这里使用string类来接收输入,需要先包含头文件string

while (true)
		{
			string select;
			cout << "请输入查找的方式:" << endl;
			cout << "1、按职工编号查找" << endl;
			cout << "2、按职工姓名查找" << endl;
			cin >> select;
			if (select == "1")
			{
				break;
			}
			if (select == "2")
			{
				break;
			}
			else
			{
				cout << "输入不合法!" << endl;
			}
		}

这是结果
string类型是一种顺序表的结构,元素是char类型的字符,这个类型可以根据输入自动分配所占内存空间的大小,string的最大容量取决于机器本身的限制或者字符串所在位置连续内存的大小(一般来说绝对够你用的了,除非你在这个输入位置输进去了一篇几万字的学术论文。)

当采用了string类型来接收数据流的时候,妈妈再也不用担心我会缓存溢出了
(>-<)/

二、使用cin对象中自带的函数清空缓存区
万一,我说的是万一,真的有人想不辞辛劳地输入一篇万字长文来挑战你代码的健壮性,这个时候该怎么办呢?那当然是把他的头锤爆 那当然是换一种方法从根本上解决问题啊~

cin这个类提供了方法来对缓存区进行清空,以下为方法详解

当cin在接收到错误的输入的时候,会设置状态位good。如果good位不为1,则cin不接受输入,直接跳过。如果下次输入前状态位没有改变那么即使清除了缓冲区数据流也无法输入。所以清除缓冲区之前必须要重置cin的状态位。
在这里我们采用cin类中的clear()函数,具体语法如下

cin.clear();
//如果在前面没有声明命名空间的话,要这样写:
std::cin.clear();

好了,重置了cin的状态位,下面需要进行缓冲区的清理,这里使用的是cin类中的ignore函数(也有使用sync()函数的,但由于程序运行时并不总是知道外部输入的进度,很难控制是不是全部清除输入缓冲区的内容。通常我们有可能只是希望放弃输入缓冲区中的一部分,而不是全部)。语法如下:

//清除输入缓冲区的当前行 
 cin.ignore(numeric_limits<std::streamsize>::max(),'\n');
//清除输入缓冲区里所有内容 
 cin.ignore(numeric_limits<std::streamsize>::max()); 
//清除一个字符
  cin.ignore()

好了,清除过后,你的代码就像掌控了兄♂贵♂之♂力一样健壮,再也不怕有熊孩子搞崩你的程序了

第一次写文,好激动a,可能有很多理解不到位或者理解错误的地方,还请大家包涵指正!(话说有人想试试输入一篇万字长文来挑战一下string容器的承受极限吗,欢迎挑战成功的同学在评论区告诉我结果,顺便留下你内存条的的型号thx

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

C++中while循环中cin语句被跳过问题解析 的相关文章

  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • 【毕业设计】单片机 图像分类 智能识别机器人 - 物联网 深度学习 AI

    文章目录 0 前言 1 项目背景 2 在 Arduino IDE 上安装 ESP32 Cam 3 用 BLINK 测试电路板 4 测试 WiFi 5 测试相机 6 运行你的网络服务器 7 水果与蔬菜 图像分类 8 结论 9 最后 0 前言
  • Element Ruoyi 若依跳转后没有滚动条

    Vue Element Ruoyi 若依跳转后页面没有滚动条的解决办法 页面 路由跳转后 body 的内联样式变成 overflow hidden 在src main js中增加一下代码 解决bug 页面 路由跳转后 滚动条消失 页面无法滚
  • DI/IOC

    控制反转 依赖注入 主要说的是通过java的反射机制将xml文件解析 主动解释依赖关系 并实例化相关bean package com bjsxt spring import java lang reflect Method import j
  • 智能合约转java_第四章 自定义sol合约转化java代码,并实现调用

    鉴于笔者以前各大博客教程都有很多人提问 早期建立一个技术交流群 里面技术体系可能比较杂 想了解相关区块链开发 技术提问 请加QQ群 538327407 准备工作 1 官方参考说明文档 2 已经在ubuntu 上搭建好FISCO BCOS 底
  • 快慢指针之练习【2】

    学习安排根据 代码随想录 leetcode 283 移动零 思路 1 直接从大到小排序 不可 需保持原来的相对顺序 2 快慢指针 如何将0移位 gt 快慢指针 赋值 代码 class Solution public void moveZer
  • Java设计模式

    一 采用设计模式的目的 二 设计模式的七大设计原则 三 常见的设计模式
  • 通过命令行开启和关闭oracle

    1 启动oracle10g 建一个以bat结尾的文件 内容为 net start OracleServiceORCL net start OracleORADB10gTNSListener 2 关闭oracle10g 建一个以bat结尾的文
  • 西门子PLC中如何解决流量累积问题

    现在上位机系统中很多要求具备流量计的流量累计功能 由此引出的几个问题 期望与大家分享 问题1 自行编写流量累计程序 自行编写流量累计程序的原理 其实就是积分的最原始算法概念 把单位小间隔时间内的瞬时流量乘以单位间隔时间 得到单位小间隔时间内
  • kafka详解及集群环境搭建

    一 kafka详解 安装包下载地址 https download csdn net download weixin 45894220 87020758 1 1Kafka是什么 1 Kafka是一个开源消息系统 由Scala写成 是由Apac
  • layout注意事项_注意事项

    layout注意事项 In the post we will look at how you can orchestrate real time customer journeys with Adobe s Journey Orchestr
  • 【华为OD统一考试B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • from: can't read /var/mail/xxx 解决方法

    在执行一个发包脚本的时候 遇到了如下问题 from can t read var mail scapy all 原因 脚本是没有问题的 但它并不是可以被python执行的可执行文件 解决方法 1 使用python 脚本名字 命令执行脚本 2
  • k210自学快速入门(附网址)

    一 获得下载工具IDE https dl sipeed com MAIX MaixPy ide 安装和配置见该博客 http t csdn cn 464lj 二 下载固件 1 用于程序的执行下载站 Sipeed 注意 minimum是最小版
  • sqlalchemy create_engine关于连接池的几个参数

    pool size 设置连接池中 保持的连接数 初始化时 并不产生连接 只有慢慢需要连接时 才会产生连接 例如我们的连接数设置成pool size 10 如果我们的并发量一直最高是5 那么我们的连接池里的连接数也就是5 当我们有一次并发量达
  • 级联菜单的动态实现(数据库绑定)

    效果预览 数据库设计 第一类型 第二类型 第三类型 Controller层代码 RequestMapping noFilterGetAllInfo public void noFilterGetAllInfo Integer firstSe
  • 【调试经验】MySQL - fatal error: mysql/mysql.h: 没有那个文件或目录

    机器环境 Ubuntu 22 04 3 LTS 报错问题 在编译一个项目时出现了一段SQL报错 CGImysql sql connection pool cpp 1 10 fatal error mysql mysql h 没有那个文件或目
  • python推荐系统学习笔记(5)——基于图的模型推荐算法

    python推荐系统学习笔记 5 基于图的模型推荐算法 2 1 用户行为数据的二分图表示 为可以把基于邻域的模型看作基于图的模型的简单形式 用户物品二分图模型 对于数据集中每一个二元组 u i 图中都有一套对应的边e vu vi 其中vu属
  • java listnode 合并链表_java实现链表合并

    输入两个单调递增的链表 输出两个链表合成后的链表 当然我们需要合成后的链表满足单调不减规则 最容易想到的就是新建一个链表 一个一个将节点连接到新链表中 代码 public ListNode Merge ListNode list1 List
  • Linux C/C++解析xls

    libxls作为开源库 支持在Linux C C 环境下解析 读 xls文件 github提供了源码 https github com libxls libxls 但是github的源码需要一堆辅助工具 才能够编译出libxls的C静态库
  • C++中while循环中cin语句被跳过问题解析

    今天在写代码的时候 遇到了一个非常奇怪的问题 while true int select cout lt lt 请输入查找的方式 lt lt endl cout lt lt 1 按职工编号查找 lt lt endl cout lt lt 2