输入数据时希望有个合法性检验的问题,如果输入的数据不合法则程序提示重新输入。最初代码如下:
#include <iostream>
#include <vector>
using std::cin ;
using std::cout ;
using std::endl;
using std::vector ;
int main()
{
int num;
vector<int> ivec;
do
{
cout<<"please enter some numbers:"<<endl;
while(cin>>num)
ivec.push_back(num);
if(ivec.size()==0)
cout<<"Error!"<<endl;
}while(ivec.size()==0);
}
这样写如果第一次正确输入,程序运行正确。但如果第一次没有输入有效字符(比如输入ctrl+z,回车)或者第一个输入为非法字符,则程序陷入死循环,不停的输出提示信息,但是不允许用户再次输入。(注意,ctrl+z表示文件结束,当输入其后,并按下回车,cin>>不会读取,并且清空输入缓存)
正确写法:
#include <iostream>
#include <vector>
using std::cin ;
using std::cout ;
using std::endl;
using std::vector ;
int main(){
int num;
vector<int> ivec;
do{
cout<<"please enter some numbers:"<<endl;
while(cin>>num)
ivec.push_back(num);
//增加了两行
cin.clear();
cin.ignore();//使用cin.sync()在VS中会无效
if(ivec.size()==0)
cout<<"Error!"<<endl;
}while(ivec.size()==0);}
在错误代码中,如果一开始就输入了一个字符而不是数字,那么推出while()循环,且cin.badbit置位置,下次无法输入,如果加入了cin.clear(),清楚了badbit,但是缓冲区第一个任然是一个字符,下次又会退出while()循环,因此要加入cin.clear()和cin,ignore().
注意:
1.cin>>不读取空格以及回车,除非加入 cin>>noskipws>>num;
2.当按下ctrlz+z再按下回车的时候,因为ctrl+z是文件结束,所以会清除缓冲区,到了cin.ignore()的时候,现在缓冲区是空的,所以在这里需要等待我们输入