天天看點

身份證号碼驗證

參考代碼如下:

#include "stdio.h"
#include "string.h"
//身份證驗證 15位或18位
//15位隻是驗證出生日期是否符合規範
//18位除了驗證出生日期,還需要驗證校驗位是否滿足校驗規則

int checkChars(char str[18]){
	int flag=1; //0代表錯誤,1代表正确
	int length=strlen(str);
	for(int i=0;i<length-1;i++){
		if(str[i]<'0'||str[i]>'9')
		{
			flag=0;
			return flag;
		}
	}
	//判D斷?最Á?後¨®一°?位?
	if (length==18){
		if ((str[length-1]>='0' && str[length-1]<='9') ||(str[length-1]=='x' || str[length-1]=='X'))
			flag=1;
		else{
			flag=0;
			return flag;
		}
	}
	else{
		if (str[length-1]>='0' && str[length-1]<='9')
			flag=1;
		else {
			flag=0;
			return flag;
		}
	}	
	return flag;
}

int checkDay(int year, int month, int day)
{//判斷日期是否是合法的日期
	int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	int yearflag;
	if ((year%4==0 && year%100!=0) ||(year %400==0))
		yearflag=1; //閏年
	else
		yearflag=0; //不閏年

	if (yearflag==1)
		days[1]=29;

	if (day>days[month-1])
		return 0; //error
	else 
		return 1; //right
}

void main()
{
	int flag=-1; 
	char cardNumber[18];
	printf("please input the card number(15/18):\n");
	scanf("%s", cardNumber);
	
	//first check the chars are numbers or not chars
	int length=strlen(cardNumber);
	
	if (length!=15 && length!=18){
		flag=0; //位?數ºy不?相¨¤符¤?
	}else{
		//首先驗證其中的每一位是否是字元
		int flag1=checkChars(cardNumber);
		if (flag1==0)
			flag=1; //輸入的字元非數字或最後一位不是X
		else{
			int year, month, day;
			if (length==18){
				year=(cardNumber[6]-'0')*1000+(cardNumber[7]-'0')*100+(cardNumber[8]-'0')*10+(cardNumber[9]-'0');
				month=(cardNumber[10]-'0')*10+(cardNumber[11]-'0');
				day=(cardNumber[12]-'0')*10+(cardNumber[13]-'0');
			}
			else{
				year=(cardNumber[6]-'0')*10+(cardNumber[7]-'0')+1900;
				month=(cardNumber[8]-'0')*10+(cardNumber[9]-'0');
				day=(cardNumber[10]-'0')*10+(cardNumber[11]-'0');
			}

			int flag2=checkDay(year,month,day);
			if (flag2==0)
				flag=2; //日期不合法
			else{
				//判斷18位時校驗位是否正确
				if (length==18){
					int weight[18] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1}; 
					int validcode[11] = {1,0,10,9, 8, 7, 6, 5, 4, 3, 2};//				
int number[18];
				for(int i=0;i<17;i++)
					number[i]=cardNumber[i]-'0';

				if (cardNumber[17]=='x' || cardNumber[17]=='X')
					number[17]=10;
				else
					number[17]=cardNumber[17]-'0';

				int sum=0;

				for(int i=0;i<17;i++)
					sum+=weight[i]*number[i];

				sum=sum%11;
				if(number[17]==validcode[sum])
					flag=-1;
				else
					flag=3; //校驗位錯誤				
				}
			}
		}
	}

	if (flag>=0)
		printf("the card number you is %s, and it is an illegal number", cardNumber);
	else
		printf("the card number you is %s, and it is one legal number", cardNumber);
}


           

繼續閱讀