C++判断身份证是否合法

int CRegisterNewUserDlg::IsRight(string card)
{    
int error=0; 
int length=(int)card.length(); 
if (length < 10)
{
error=-5;
return error;
}
cout<<length<<endl; 
int index=card.find_first_not_of("1234567890xX"); 
if(index!=card.npos) 
{   
error=-1;  //号码中有非数字字符 
return error;
}    
if(!BirthdayIsRight(card)) 
{     
error=-4; //出生年月错误 
return error;

if(length==18)     //验证18位身份证号码 
{ int no[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; 
char id[]={'1','0','X','9','8','7','6','5','4','3','2'};                        
//1 0 X 9 8 7 6 5 4 3 2   校验码    
const char *p=card.c_str(); 
int i=0,wi=0,sum=0; 
for(;i<length-1;i++) 
{  
wi=(*(p+i)-'0')*no[i];  
sum+=wi; 

if(*(p+i)<'0'||*(p+i)>'9') 
{   
if (*(p+i)!='X'&&*(p+i)!='x')   
{     
error=-2;//身份证最后一位输入错误   
return error;


wi=sum%11;  
if(*(p+17)=='x'||*(p+17)=='X')            //最后一位为'x'或'X';             
{                
if(id[wi]!='x'&&id[wi]!='X')                   
{
error=-3;      
return error;
}
}        
else if(id[wi]!=*(p+17))     //判断计算出的身份证校验码与输入是否相符  
{   
error=-3;  
return error;


return error;
} //判断身份证号码中的年月日是否正确  
bool CRegisterNewUserDlg::BirthdayIsRight(string cardId)  
{    
string year,month,day;    
bool flag=false; 
int length=cardId.length();   
if(length==18)
{    
year=cardId.substr(6,4);//取18位身份证中的年    
month=cardId.substr(10,2); // 月    
day=cardId.substr(12,2);   //日    
}    
else    
{    
year=cardId.substr(6,2);//取15位身份证中的年    
month=cardId.substr(8,2); // 月    
day=cardId.substr(10,2);   //日    
year="19"+year;    
}    
if(atoi(year.c_str())==0||atoi(month.c_str())==0||atoi(day.c_str())==0) 
{  
flag=false; 

else if(GetDay(atoi(year.c_str()),atoi(month.c_str()))>=atoi(day.c_str()))    
{    
flag=true;    

}    
return flag;  
}//得到指定年跟月的天数
int CRegisterNewUserDlg::GetDay(int year,int month)  
{      
int day=0;       
switch (month)       
{       
case 1:       
case 3:       
case 5:       
case 7:       
case 8:       
case 10:       
case 12:       
{        
day=31;       
break;       
}       
case 4:       
case 6:       
case 9:       
case 11:       
{       
day=30;       
break;       
}        
case 2:        
{        
if(year%4==0&&year%100!=0||year%400==0)        
day=29;        
else        
day=28;          
break;        
}        
default :  
{         
day=-1;        
break;        
}       
}       
return day;  
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值