身份证校验

int 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 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 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;  
}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值