问题描述: 
我国公民的身份证号码特点如下:
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)

示例
1、输入:”511002111222”,函数返回值:1;
2、输入:”511002abc123456789”,函数返回值:2;
3、输入:”51100219880808123a”,函数返回值:3;
4、输入:”511002188808081234”,函数返回值:4;
5、输入:”511002198813081234”,函数返回值:5;
6、输入:”511002198808321234”,函数返回值:6;
7、输入:”511002198902291234”,函数返回值:6;

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

C代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>int verifyIDCard(char* input);
int is_leapyear(int year);
int getyear(char* input);
int getmonth(char* input);
int getday(char* input);
int check_1to17(char* input);
int check18(char* input);
int chech_year_month_day(int year, int month, int day);int main()
{char input[8][100] = {"511002111222","511002abc123456789","51100219880808123a","511002188808081234","511002198813081234","511002198808321234","511002198902291234","511002198808081234"};int i;for(i=0; i<8; i++){printf("the IDcard is: %s, the result is: %d\n",input[i],verifyIDCard(input[i]));}return 0;
}int is_leapyear(int year)
{if(( (year%4==0) && (year%400!=0) ) || (year%400==0))return 1;return 0;
}int getyear(char* input)
{int year=0;year = (input[6]-'0') * 1000 + (input[7]-'0') * 100 +(input[8]-'0') * 10 + (input[9]-'0');return year;
}int getmonth(char* input)
{int month=0;month = (input[10]-'0') * 10 + (input[11]-'0');return month;
}int getday(char* input)
{int day=0;day = (input[12]-'0') * 10 + (input[13]-'0');return day;
}int check_1to17(char* input)
{int i;for(i=0; i<17; i++)if( !(input[i]>='0' && input[i]<='9') )return 0;return 1;
}int check18(char* input)
{char ch = input[17];if( (ch=='x') || (ch>='0' && ch<='9') )return 1;elsereturn 0;
}int check_year_month_day(int year, int month, int day)
{int leap;leap = is_leapyear(year);if(year<1900 || year>2100)return 4;if(month<1 || month>12)return 5;switch(month){case 1:case 3:case 5:case 7:case 8:case 10:case 12:{if(day<1 || day>31)return 6;break;}case 4:case 6:case 9:case 11:{if(day<1 || day>30)return 6;break;}case 2:{if(leap){if(day<1 || day>29)return 6;break;}else{if(day<1 || day>28)return 6;break;}}}return 0;
}int verifyIDCard(char* input)
{int year,month,day;if(strlen(input)!=18)return 1;else{if(!check_1to17(input))return 2;else{if(!check18(input))return 3;else{year = getyear(input);month = getmonth(input);day = getday(input);return check_year_month_day(year,month,day);}}}
}

运行结果如下:

身份证号码合法性判断相关推荐

  1. hive自定义函数-身份证号合法性判断

    hive自定义函数-身份证号合法性判断 简要 代码 简要 身份证号合法性判断: 若为18位身份证号: 1.第18位数字,应该在身份证号最后一位校验位数字中 2.前17为数字分别乘以对应的加权因子,累加 ...

  2. 校验18位身份证号码(判断最后一位校验位和性别)

    身份证号码组成 公民身份号码是一系列组合码,由十七位数字本体码和一位校验码组成. 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码. 18位身份证最后一位校验码的 ...

  3. 身份证号码合法性检验(python)

    合法性校验 在安全测试的过程中经常遇到使用身份证注册,造成信息泄露,或者是造成任意信息注册,就需要构造一些看起来合理的号码,进行测试,为了方便就打算自己写一个校验是否合理. a=input(" ...

  4. JS验证身份证号码合法性

    <html> <head> <script type="text/javascript">     function validateCard( ...

  5. 比较严谨的java验证18位身份证号码

    /** * 我国公民的身份证号码特点如下* 1.长度18位* 2.第1-17号只能为数字* 3.第18位只能是数字或者x* 4.第7-14位表示特有人的年月日信息* 请实现身份证号码合法性判断的函数, ...

  6. js根据身份证号码判断性别和年龄

    /**这是一个超实用的用js根据身份证号码判断性别男女的特效代码,详细看下面的*/ /** 根据身份证号码判断性别 15位身份证号码:第7.8位为出生年份(两位数),第9.10位为出生月份,第11.1 ...

  7. JS(JavaScript)验证身份证号码格式的合法性

    一.JS(JavaScript)验证身份证号码格式的合法性,前端工程师会用到JavaScript验证身份证号码是否合法,这里分享一段本人多年以前多写的JavaScript验证输入身份证号码合法性的代码 ...

  8. 身份证号码的验证与解析

    18位身份证号码解析器,可以验证输入的字符串是否是真实的身份证号,还可以将身份证号码中的信息解析出来,包括籍贯(因为到县的数据太多,只到省一级).出生日期和性别. package cn.myj.api ...

  9. Excel中身份证号码验证,那些不得不说的事

    点赞再看,养成习惯:流水不腐,户枢不蠹. 微信搜索[亦心Excel]关注这个不一样的自媒体人. 本文 GitHub https://github.com/hugogoos/Excel 已收录,包含Ex ...

最新文章

  1. 可爱的特殊字符集收集
  2. CTF-Misc--处理压缩包大量文件将其转为二进制->10进制->字符串 脚本
  3. 认清JavaScript和JAVA全局变量和局部变量的作用域
  4. GPD电脑安装linux,怕虚拟机影响性能?GPD pocket 2 安装 Ubuntu 体验
  5. 图像拼接1 特征提取
  6. 跨平台屏幕/摄像头RTMP推流模块设计要点
  7. 中国特种电器灯泡行业市场供需与战略研究报告
  8. Docker 架构(二)【转】
  9. Java基础002 Java9开发环境搭建(Win10平台)
  10. WordPress中导入图片模糊
  11. 卡瓦莱斯的世界杯往事
  12. 整理全网可视化大屏有关资料,学习大屏设计,大屏原型参考,大屏设计参考
  13. 小谢同学的C语言之路————第一章 初遇C语言 第二集 数据类型
  14. 微信小程序 自动换行
  15. SDIO WiFi调试经验总结
  16. html好友页面,好友列表.html
  17. 论文笔记:基于深度学习的遥感影像变化检测综述
  18. QT中$$PWD的意思(转)
  19. 小玉在游泳小鱼的航程(改进版)
  20. python udp伪造ip_Python扭曲的简单UDP转发器。保留源IP?

热门文章

  1. java毕业设计个人理财系统Mybatis+系统+数据库+调试部署
  2. FCRA题库及答案(未完待续)
  3. Facebook,Twitter和实时聊天按钮:创建精通社交的WordPress网站
  4. 直流微电网共直流母线技术及应用
  5. 卖茶叶怎么引流?卖茶叶引流方法有哪些?茶叶店如何做推广
  6. 利用WireShark对手游的协议抓包
  7. WIFI破解系列:(03)VMware Workstation虚拟机如何连接usb网卡
  8. acigs明文密码我的生日剧本_生日被迫挂伤?肖战忍无可忍终发威,工作室发出声明末尾点睛...
  9. MongoDB之初识(一)
  10. 全局组合按键-老板键