您的位置:首页 > 其它

身份证号码的合法性判断

2012-05-19 13:12 302 查看
/***************************************************************************************************************************

身份证号码合法性判断

问题描述:

我国公民的身份证号码特点如下:

1、 长度为18位;

2、 第1~17位只能为数字;

3、 第18位可以是数字或者小写英文字母x。

4、 身份证号码的第7~14位表示持有人生日的年、月、日信息。

例如:511002198808080111或51100219880808011x。

请实现身份证号码合法性判断的函数。除满足以上要求外,需要对持有人生日的年、月、日信息进行校验。年份大于等于1900年,小于等于2100年。需要考

虑闰年、大小月的情况。所谓闰年,能被4整除且不能被100整除 或 能被400整除的年份,闰年的2月份为29天,非闰年的2月份为28天。其他情况的合法性

校验,考生不用考虑。

函数返回值:

1) 如果身份证号合法,返回0;

2) 如果身份证号长度不合法,返回1;

3) 如果身份证号第1~17位含有非数字的字符,返回2;

4) 如果身份证号第18位既不是数字也不是英文小写字母x,返回3;

5) 如果身份证号的年信息非法,返回4;

6) 如果身份证号的月信息非法,返回5;

7) 如果身份证号的日信息非法,返回6(请注意闰年的情况);

【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。

要求实现函数:

int verifyIDCard(char* input)

【输入】 char* input,表示输入的身份证号码字符串

【输出】 无

【返回】 判断的结果,类型为int

示例

1) 输入:”511002111222”,函数返回值:1;

2) 输入:”511002abc123456789”,函数返回值:2;

3) 输入:”51100219880808123a”,函数返回值:3;

4) 输入:”511002188808081234”,函数返回值:4;

5) 输入:”511002198813081234”,函数返回值:5;

6) 输入:”511002198808321234”,函数返回值:6;

7) 输入:”511002198902291234”,函数返回值:7;

8) 输入:”511002198808081234”,函数返回值:0;

***************************************************************************************************************************/

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

int verifyIDCard(char* input)

{

if(strlen(input)!=18)

return 1;

int i;

for(i=0;i<17;i++)

{

if(input[i]<'0'||input[i]>'9')

return 2;

}

if(input[17]=='x' || (input[17]>='0' && input[17]<='9'));

else return 3;

char year[5];

year[0]=input[6];

year[1]=input[7];

year[2]=input[8];

year[3]=input[9];

year[4]='\0';

unsigned int year_number=atoi(year);

if(year_number<1900||year_number>2100)

return 4;

char month[3];

month[0]=input[10];

month[1]=input[11];

month[2]='\0';

unsigned int month_number=atoi(month);

if(month_number<1||month_number>12)

return 5;

char day[3];

day[0]=input[12];

day[1]=input[13];

day[2]='\0';

unsigned int day_number=atoi(day);

if(((year_number%4==0) && (year_number%100!=0)) || (year_number%400==0))

{

if(2==month_number)

{

if(day_number<1 || day_number>29)

return 6;

}

else if(month_number==1 || month_number==3 || month_number==5 || month_number==7 || month_number==8 || month_number==10 || month_number==12)

{

if(day_number<1 || day_number>31)

return 6;

}

else

{

if(day_number<1 || day_number>30)

return 6;

}

}

else

{

if(month_number==2)

{

if(day_number<1 || day_number>28)

return 6;

}

else if(month_number==1 || month_number==3 || month_number==5 || month_number==7 || month_number==8 || month_number==10 || month_number==12)

{

if(day_number<1 || day_number>31)

return 6;

}

else

{

if(day_number<1 || day_number>30)

return 6;

}

}

return 0;

}

int main()

{

int J;

char str[25];

printf("input the IDnumber:");

gets(str);

J=verifyIDCard(str);

printf("\nThe return_value=%d",J);

system("pause");

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: