身份证号码验证 !

#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; //闰年elseyearflag=0; //不闰年if (yearflag==1)days[1]=29;if (day>days[month-1])return 0; //errorelse 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 charsint length=strlen(cardNumber);if (length!=15 && length!=18){flag=0; //位?数ºy不?相¨¤符¤?}else{//首先验证其中的每一位是否是字符int flag1=checkChars(cardNumber);if (flag1==0)flag=1; //输入的字符非数字或最后一位不是Xelse{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;elsenumber[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);elseprintf("the card number you is %s, and it is one legal number", cardNumber);}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值