参考代码如下:
#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);
}