cin、cin.clear()、cin.ignore()与输入缓冲区
来源:互联网 发布:网站中文域名注册 编辑:程序博客网 时间:2024/06/06 11:01
C++将输入看作是流入程序的字符流,iostream文件定义cin为表示这种流的对象
对应的输入数据都会先存入输入缓冲区,cin从输入缓冲区中读入数据,所以当缓冲区中有残留数据时,cin直接取得残留数据而不会请求键盘输入
cin是以空格为分隔的,而读到回车后,结束输入,丢掉换行,即回车在正常情况下不进入缓冲区
那么,在非法输入后,我们会面对什么呢?
#include<iostream>using namespace std;int main(){ int a,b; cin >> a; //cout << " cin.fail == " << cin.fail() << endl; //cin.clear(); //cin.ignore(); cin >> b; cout << "a == " << a << " b == " << b; return 0;}
这段代码在等待一个整形的输入,如果你输入的是一个字符,那么,就会cin,fail会置为1,并打断接下来的输入,而那个字符和回车会停留在缓冲区,而cin在读入失败时会返回0,也就是说,这段代码,当你输入a 1后,输出为a == 0 b == 0
这个时候就用到了cin.clear(),cin.ignroe(),很多人以为cin.clear()顾名思义就是清空缓冲区,其实它是将cin.fail复位为0,也就是说恢复到继续可以输入的状态,而cin.ignore()会丢掉缓冲区中的一个错误输入字符
记得这两个要一起用,不然当你回复输入后,那个字符还在缓冲区中,下一个b的输入就又错了
cin.ignore()参数为cin.ignore( int num,char ch),意思是丢掉缓冲区中数据达到num个或遇到ch时停止,不给参数默认为cin.ignore(1,EOF),即取出并丢掉错误输出前的一个字符
我们的一般用法要么不给参数,要么给很大一个num,ch给’\n’,也就是说,丢掉一行,像是缓冲区里残留的是字符串时,用这个就比较方便
再看这段代码
#include<iostream>using namespace std;int main(){ int a; cin >> a; cin.get(); cin.get(); cout << "读取了回车\n"; return 0;}
当你输入一个字符后,它输出了那句话,也就是说,当你发生错误输入后,那个字符和回车都留在了缓冲区,而正常情况下回车并不会进缓冲区
还有一个函数是cin.sync(),我看有很多人认为他的作用是清楚缓冲区,但是我试了试,使用它,并没有清除,错误输入仍然会残留在缓冲区,跪求知道的大佬告诉我~…
- cin、cin.clear()、cin.ignore()与输入缓冲区
- 缓冲区及流状态、cin.sync()、cin.clear()、cin.ignore()
- cin.clear()与cin.sync()与cin.ignore()
- cin.fail(), cin.bad(), cin.good(), cin.clear(), cin.ignore()
- cin.fail(), cin.bad(), cin.good(), cin.clear(), cin.ignore()
- cin 与输入缓冲区
- 浅析cin.getline,cin.get,cin.ignore,cin.clear用法
- cin.clear()与cin.sync()
- cin流输入控制(clear(),sync(),flush(),ignore())
- cin.ignore()
- cin.ignore
- cin.clear()。cin.get()
- cin.get,cin.clear()
- cin.ignore与cin.getline与cin.peek()
- [转]浅析cin.getline,cin.get,cin.ignore,cin.clear用法
- cin.getline,cin.get,cin.ignore,cin.clear用法(转)
- cin.clear()
- cin、cin.get()、cin.getline()、getline()、gets()等函數的用法 以及cin.ignore,cin.clear等。。
- JPA高级映射
- 实现Register&Login过程中遇到的问题
- css基础-选择器
- scala 隐式转换(一)
- @Component注解
- cin、cin.clear()、cin.ignore()与输入缓冲区
- python文件读写
- 动态内存分配malloc
- 反射
- JPA实体关系
- java中new一个对象jvm做了哪些事情
- 如何完全的卸载MySQL数据库?
- Flume与Kafka整合案例详解
- windows环境下安装zookeeper