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