2.C++之cin(一)——关于合法性检验

本文介绍了一种在C++中进行输入验证的方法,确保只有合法的数据才能被程序接受。通过使用cin.clear()和cin.ignore()来处理非法输入,避免程序进入死循环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入数据时希望有个合法性检验的问题,如果输入的数据不合法则程序提示重新输入。最初代码如下:

#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()的时候,现在缓冲区是空的,所以在这里需要等待我们输入

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值