整理过后,重发帖:清空输入流
#include<iostream>#include<vector>#include<stdexcept>#include<cstdio>using namespace std; void keep_window_open(){ cin.clear(); [color=#FF0000]cout<<unitbuf; //就是这个地方,我想将输入流彻底清空,不知道用什么方法[/color] cout << "Please enter a character to exit\n"; char ch; cin >> ch; cout <<ch <<endl; return;}int main() try{ vector<int> v; int x; while(cin>>x) { v.push_back(x); } for(int i=0;i<=v.size();i++) cout<<"v["<<i<<"]=="<<v.at(i)<<endl;}catch (exception& oor) { cerr << "Out of Range error: " << oor.what() << endl; keep_window_open(); return 1; }catch(...){ cerr<<"exception :something went wrong\n"; return 2;}#include <iostream>#include <vector>#include <cstdio>using namespace std;void keep_window_open(){ cout << "Please enter a character to exit\n"; char ch; rewind(stdin); ch=getchar(); cout << ch <<endl; return;}int main() { vector<int> v; int x,r; while (1) { r=scanf("%d",&x); if (1==r) {//输入一个整数回车 v.push_back(x); } else if (0==r) { cerr << "Invalid input!" << endl; keep_window_open(); return 1; } else if (EOF==r) {//输入Ctrl+Z回车 break; } else { cerr << "exception :something went wrong\n"; return 2; } } for (int i=0;i<=v.size();i++) cout << "v[" << i << "]==" << v.at(i) << endl; return 0;}//11//22//s//Invalid input!//Please enter a character to exit//a//a
[解决办法]
先调用cin.clear(),然后调用cin.sync()。
当程序想要去读一个int型却读到了一个char型输入的时候,cin就会将自己的内部错误标识符设定为ios::failbit(没有错误是ios::goodbit),cin.clear()的作用不是清空输入缓冲区,而是清空这个内部错误标识符,真正清空输入缓冲区的是cin.sync(),但是只清空缓冲区也不行,因为内部错误标识符还保留着呢,下次读取的时候一看上次有错误,这次根本不读了,所以一定要一起调用。