C++中cin.clear()的用法

2023-10-30


我们谈谈cin.clear的作用,第一次看到这东西,很多人以为就是清空cin里面的数据流,而实际上却与此相差很远,首先我们看看以下代码:

 

#include <iostream> 
using namespace std; 
int main()  
{         
    int a;         
    cin>>a;         
    cout<<cin.rdstate()<<endl;         
    if(cin.rdstate() == ios::goodbit)   
    {   
        cout<<"输入数据的类型正确,无错误!"<<endl;               
    }         
    if(cin.rdstate() == ios_base::failbit)         
    {                 
        cout<<"输入数据类型错误,非致命错误,可清除输入缓冲区挽回!"<<endl;         
    }         
    system("pause"); 
}
 
我们定义要输入到的变量是整型,但如果我们输入了英文字母或者汉字,那就会发生错误,cin里有个方法能检测这个错误,就是cin.rdstate(); 当cin.rdstate()返回0(即ios::goodbit)时表示无错误,可以继续输入或者操作,若返回4则发生非致命错误即ios::failbit,则不能继续输入或操作.而cin.clear则可以控制我们此时cin里对这个问题的一个标识.语发如下: cin.clear(标识符); 标识符号为:

goodbit 无错误 
Eofbit 已到达文件尾 
failbit 非致命的输入/输出错误,可挽回 
badbit 致命的输入/输出错误,无法挽回 若在输入输出类里.需要加ios::标识符号 
通过cin.clear,我们能确认它的内部标识符,如果输入错误则能重新输入.结合真正的清空数据流方法cin.sync(),请看下例:
 
#include <iostream> 
using namespace std; 
int main()  
{         
    int a;         
    while(1)         
    {                 
        cin>>a;                 
        if(!cin)            //条件可改写为cin.fail()                 
        {                         
            cout<<"输入有错!请重新输入"<<endl;                         
            cin.clear();                          
            cin.sync();   //清空流                 
        }                 
        else                 
        {                         
            cout<<a;                         
            break;                 
        }         
    }         
    system("pause"); 
}
 
上面的cin.clear()默认参数为0,即无错误,正常操作.当我们输入英文字母'k'时,它的状态标识改为fail,即错误,用cout对用户输出信息,再用cin.clear让错误标识改回为0,让我们可以继续输入,再清空流数据继续输入.如果我们没有了cin.clear,则会进入死循环,其过程为我们输入了英文字母,它的状态标识便为fail,当运行到条件判断时,便总是回到错误的条件表示里,并且我们再也没办法输入,因为错误的表示关闭了cin,所以会进入死循环.
转自http://www.cnblogs.com/tonglingliangyong/p/3908463.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中cin.clear()的用法 的相关文章

随机推荐

  • ES索引库的别名的强大功能

    ES 的别名不停服切换索引 线上发布 场景 我们现在线上正在使用 ES索引库 V 没有使用ES索引库别名 两个问题 现在由于字段更新 把线上的数据重新写入了V1库 现在如何在不断服的情况下 完美的实现 从V 切换到V1 索引库 后续如果再次
  • 基于Matlab实现帧间差分法的运动目标检测(附上完整源码+图像+程序运行说明)

    帧间差分法是一种常用的运动目标检测方法 可以通过对连续帧之间的差异进行分析来确定目标的运动情况 在本文中 我们将介绍如何使用Matlab实现帧间差分法的运动目标检测 文章目录 部分源码 完整源码 图像 程序运行说明下载 部分源码 首先 我们
  • 离线安装npm包

    1 先在联网机器上下载安装npm bundle和http server 以管理员身份运行打开cmd 然后npm install npm bundle 或者 cnpm install npm bundle npm install http s
  • Springboot 封装Fastdfs 功能模块

    整体项目结构 第一步 BuleSky 的pom xml 文件
  • android apk应用系统集成编译错误问题

    在系统源码中添加一个APK源码目录 并写了相应的android mk文件 编译时出错如下 make No rule to make target out target common obj JAVA LIBRARIES liba71S in
  • ServletRequest和HttpServletRequest为什么可以强制转换

    ServletRequest强制转换为HttpServletRequest为什么没报错呢 先看一下普通转换 1 父类对象强转成子类 出错ClassCastException Father f new Father Son s Son f 2
  • 插入排序的递归算法

    一 算法思想 由插入排序的基本思想可以得到它的递归算法 确定前面的数是已经排好序了的 从当前数开始 依次一个个的插入到前面的数中 二 代码 插入排序的递归算法 void insert vector
  • 【C++】multiset用法

    转自 https blog csdn net sodacoco article details 84798621 c 语言中 multiset是
  • 【Clipping input data to the .... for integers).】的解决办法

    Clipping input data to the for integers 的解决办法 参考资料 https www freesion com article 7534157435 在用matplotlib pyplot显示输入图像时
  • 磁盘扩容(LVM)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 磁盘扩容 LVM 一 LVM是什么 二 LVM制作 创建LVM逻辑卷 创建pv 物理卷 创建vg 卷组 创建lv 逻辑卷 制作文件系统并挂载 制作文件系统 格式化 挂载 查看
  • IDEA的基本使用

    1 设置字体 2 改背景颜色默认为白色 file gt settings Darcula是黑色 3 设置maven 4 单个项目工程的设置 使用idea创建java项目 sdk默认是内置的 我们要选择自己的 jdk idea中 一个项目就是
  • 专访 UIUC 李博

    ChatGPT 的出现让 AI 再次引起了一场科技圈的震动 这场震动影响深远 让科技界分为两派 一派认为 AI 迅速发展可能会在不久后取代人类 这种 威胁论 虽然不无道理 但另一派也提出不同观点 AI 的智力水平依然尚未赶超人类甚至 还不如
  • 如何安装stegdetect(Windows下)

    一 stegdetect 简介 1 笼统的来说 stegdetect 就是用来检测jpg类型的图片是否隐藏着其他文件或内容 据说 他还会尝试识别是用什么隐写工具将额外的信息隐藏在图片中 2 使用stegdetect时会有一些参数 下面简单罗
  • 安装pip install tensorflow==1.14报错

    pip install tensorflow 1 14 一直报错 显示只能安装2 0 以上版本时 请确认python版本是否低于3 8 3 8以上版本不支持1 x 将python 降级为3 7即可
  • 【oracle19c创建表空间及用户】

    一 oracle创建表空间及用户 1 查看当前连接的容器 SQL gt show con name CON NAME CDB ROOT 此时使用的是CDB容器 需要切换到PDB中进行 2 查看pdb下库的信息 SQL gt select n
  • Linux下安装python及更改系统原有python

    Linux下安装python及更改系统原有python 1 Linux下安装python linux中下载安装的源码文件一般习惯放在 usr local src 中 src是source的缩写 进入该目录 用wget 下载就行 假设我下载的
  • 前后端分离理解

    历史渊源 借Jsp来举例 jsp就是一个典型的前后端耦合在一起的典型的计数案例 这种模式在以前互联网不那么繁荣 web化趋势还不是那么明显的年代发挥着巨大的作用 但是随着社会技术的不断加深 各种各样的服务都web化以后 其实很多前端展示的东
  • Linux内核:配置内核(一)

    本文译自Linux orgDevynCJohnson的系列文章 Linux内核 本篇链接 http www linux org threads the linux kernel configuring the kernel part 1 4
  • Python实现 身体质量指数BMI的计算(嵩天老师)

    示例5 身体质量指数BMI BMI的定义 BMI 国际上常用的衡量人体肥胖和健康程度的重要标准 主要用于统计分析 定义 BMI 体重 kg 身高 身高 m m 身体质量指数标准 思路方法 难点在于同时输出国际和国内对应的分类 思路1 分别计
  • C++中cin.clear()的用法

    我们谈谈cin clear的作用 第一次看到这东西 很多人以为就是清空cin里面的数据流 而实际上却与此相差很远 首先我们看看以下代码 include