一、cin.clear()、cin.sync()

cin.clear()是用来更改cin的状态标示符的。

cin.sync()是用来清除缓存区的数据流的。
如果标示符没有改变那么即使清除了数据流也无法输入。所以两个要联合起来使用。例如:

#include<iostream>
using namespace std;

int main()
{
 int a;
 cout<<"输入一个字母:"<<endl;
 cin>>a;  //int型变量中放了char型数据,failbit置1
 cout<<"cin.fail()="<<cin.fail()<<endl;    //输出1

//cin.clear();
 //cin.sync();
 cout<<"输入一个数字:"<<endl;    //由于failbit值为1,输入流不能正常工作
 cin>>a;                         //故此处的输入无效
 cout<<a<<endl;                  //输出不确定值

cin.clear();                    //此处用cin.clear()流标志复位
 //cin.sync();
 cout<<"cin.fail()="<<cin.fail()<<endl;        //此处failbit已为0

cout<<"输入一个数字:"<<endl;
 //但刚才输入的字符并没有从流中清除,所以cin>>a又把那个字符放入a中,流输入流又不能正常工作
 cin>>a;
 cout<<a<<endl; //输出不确定值
 cout<<"cin.fail()="<<cin.fail()<<endl;    //在此处failbit又为1

cin.clear();            //再次修复输入流
 cin.ignore();            //取走刚才流中的字符
 cout<<"输入一个数字:"<<endl;    //再次接收用记输入,这次输入数字,正常输出了
 cin>>a;
 cout<<"a="<<a<<endl;
 //现在再看一下输入流的failbit
 cout<<"cin.fail()="<<cin.fail()<<endl;//输出0,表明输入流已恢复正常
 return 0;
}

二、cin.ignore(a,ch)

从输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到a或者被抛弃的字符是ch,则cin.ignore()函数执行终止;否则,它继续等待。

它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。

比如可以这么用:

cin.ignore(1024,'\n'),通常把第一个参数设置得足够大,这样实际上总是只有第二个参数'\n'起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去。

三、cin.sync()和cin.ignor()的比较

sync()的作用就是清除输入缓冲区。成功时返回0,失败时badbit会置位,函数返回-1.
另外,对于绑定了输出的输入流,调用sync(),还会刷新输出缓冲区。

但由于程序运行时并不总是知道外部输入的进度,很难控制是不是全部清除输入缓冲区的内容。通常我们有可能只是希望放弃输入缓冲区中的一部分,而不是全部。比如清除掉当前行、或者清除掉行尾的换行符等等。但要是缓冲区中已经有了下一行的内容,这部分可能是我们想保留的。这个时候最好不要用sync()。可以考虑用ignore函数代替。
cin.ignore(numeric_limits<std::streamsize>::max(),'/n');//清除当前行
cin.ignore(numeric_limits<std::streamsize>::max());     //清除cin里所有内容

不要被长长的名字吓倒,numeric_limits<std::streamsize>::max()不过是climits头文件定义的流使用的最大值,你也可以用一个足够大的整数代替它。

使用ignore显然能比sync()更精确控制缓冲区。(1)

(1)参考于:http://blog.csdn.net/lann64/article/details/3544479

cin.clear、cin.sync()与cin.ignore()相关推荐

  1. cin输入问题的处理:cin.clear() 、cin.sync() 、cin.ignore()

    1.cin.clear():清除cin流的错误状态,将错误标识改为默认0 2.cin.sync():清除缓冲区的数据 3.cin.ignore(): 其原型为: istream & ignor ...

  2. cin.clear()及相关用法

    1. cin.clear() 是用来更改cin的状态标示符的. cin.sync()是用来清除缓存区的数据流的. 如果标示符没有改变那么即使清除了数据流也无法输入.所以两个要联合起来使用. 我们定义要 ...

  3. C/C++——输入输出字符相关,cin.get()、getchar()和cin.getline()

    不带参数的get函数 其调用形式为 cin.get() 用来从指定的输入流中提取一个字符(包括空白字符),函数的返回值就是读入的字符. 若遇到输入流中的文件结束符,则函数值返回文件结束标志EOF(En ...

  4. C++中的几个输入函数:cin,cin.get(),getline(),cin.getline() 的区别

    目录 cin>> cin.get() getline() cin.getline() cin>> 属于istream流 1)用于输入数字. #include <iostr ...

  5. cin c语言中文网,c++ cin详解

    参考地址:http://www.cnblogs.com/A-Song/archive/2012/01/29/2331204.html 程序的输入都建有一个缓冲区,即输入缓冲区.一次输入过程是这样的,当 ...

  6. C++ cin.sync()和cin.ignore()

    cin.sync()的功能是清空缓冲区,而cin.ignore()虽然也是删除缓冲区中数据的作用,但其对缓冲区中的删除数据控制的较精确. 有时候你只想取缓冲区的一部分,而舍弃另一部分,这是就可以使用c ...

  7. 02头文件的冲突导致,清除缓冲区失败之cin.ignore() 问题

    输入任意多个整数, 把这些数据保存到文件data.txt中. 如果在输入的过程中, 输入错误, 则提示用户重新输入. 指导用户输入结束(按ctrl + z) [每行最多保存4个整数] 可能遇到的 ci ...

  8. C++ cin相关函数总结

    输入原理: 程序的输入都建有一个缓冲区,即输入缓冲区.一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据.正因为cin函数是直接从缓冲区取数据 ...

  9. C++ cin 详解之终极无惑

    代码编译运行环境:VS2017+Win64+Debug. 文章目录 1.简介 2.常用输入方法 2.1 cin>> 的用法 2.2 cin.get() 的用法 2.2.1 cin.get( ...

最新文章

  1. Linux下su与su -命令的区别
  2. bestcoder #67 div2 1003 Black Jack 概率dp
  3. 大数据分析:财务报表公开数据
  4. Linux系统中文件^M乱码解决
  5. ASP NET Core --- HTTP 翻页、过滤、排序
  6. 生成javascript正则表达式语法图
  7. SALES_ORG_RESP_SHORT and SALES_ORG_SHORT
  8. php 过滤绕过注入,PHPB2B注入#1(绕过过滤)
  9. java web 导出excel_javaweb导出excel表格
  10. python打印九九乘法表代码
  11. psd.js 解析PSD文件
  12. 代理模式---论坛权限控制代理
  13. 数据表与简单java类映射(角色权限)
  14. 疯狂原始人服务器维修,疯狂原始人服务器互通详解 安卓和ios能一起玩么
  15. 蓝牙车载 linux,《基于嵌入式Linux蓝牙在车载电子系统中的应用》.pdf
  16. vue中的子传父和父传子
  17. C# 反射类Assembly用法举例
  18. 大聪明教你学Java | 深入浅出聊乐观锁与悲观锁(synchronized 悲观锁)
  19. 史上最小白之Transformer详解
  20. 如何实现文件目录自动生成(Windows操作系统)

热门文章

  1. ipad8和ipad9哪个好
  2. arcgis里dem填洼_ArcGIS教程:创建无凹陷点的 DEM
  3. C#中Log4的使用教程
  4. C++学习书籍推荐《C++程序设计原理与实践》下载
  5. 【数据挖掘与商务智能决策】第一、二章 数据分析与三重工具
  6. 金融行业大数据用户画像实践
  7. 什么是用户画像?金融行业大数据用户画像实践
  8. 使用frps和frpc实现内网穿透
  9. 伦敦房价今年和明年将下跌,三分之一的机会出现崩盘 - 路透调查
  10. unc 目录不受支持_windows unc途径不受支持的解决