#include<stdio.h> #include<string.h> //校验省份代码 /** * <pre> * 省、直辖市代码表: * 11 : 北京 12 : 天津 13 : 河北 14 : 山西 15 : 内蒙古 * 21 : 辽宁 22 : 吉林 23 : 黑龙江 31 : 上海 32 : 江苏 * 33 : 浙江 34 : 安徽 35 : 福建 36 : 江西 37 : 山东 * 41 : 河南 42 : 湖北 43 : 湖南 44 : 广东 45 : 广西 46 : 海南 * 50 : 重庆 51 : 四川 52 : 贵州 53 : 云南 54 : 西藏 * 61 : 陕西 62 : 甘肃 63 : 青海 64 : 宁夏 65 : 新疆 * 71 : 台湾 * 81 : 香港 82 : 澳门 * 91 : 国外 * </pre> */ const char* cityCode[35] = { "11", "12", "13", "14", "15", "21", "22", "23", "31", "32", "33", "34", "35", "36", "37", "41", "42", "43", "44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63", "64", "65", "71", "81", "82", "91" }; int checkCityCode(const char* city) { int i = 0; for(i = 0; i < 35; i++ ) { if( memcmp(cityCode[i],city,2) == 0) { return 0;} } return 1; } //校验一个字符是否是数字 int isdigit(int c) { return (c >= '0' && c <= '9'); } //校验出生日期 日期格式 YYYYMMDD如"19870912" /* 身份证15位转18位原理:身份证中的年份补全,即:第六、七位之间增加“1”“9”(目前大多数是20世纪出身的),现在身份证号码位数是17位。 第18位确定:将身份证号码17位数分别乘以不同系数,为7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。 将这17位数字相加除以11,得到余数。 余数只可能为0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的数为1-0-X-9-8-7-6-5-4-3-2。而这个数就是最后一位身份证号码。 */ /*************************************************** * 函 数 名: Chk18PaperId * * 函数功能: 校验18位身份证号码,15位的号码需补齐18位 * * 输入参数: sPaperId 身份证号 * * 输出参数: * * 返回值: 0 成功 * 其他 失败 ****************************************************/ int Chk18PaperId (char *sPaperId) { long lSumQT =0; //加权因子 int R[] ={7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; //校验码 char sChecker[11]={'1','0','X', '9', '8', '7', '6', '5', '4', '3', '2'}; //检验长度 if( 18 != strlen(sPaperId)) return -1; //校验数字 for (int i=0; i<18; i++) { if ( !isdigit(sPaperId[i]) && !(('X' == sPaperId[i] || 'x' == sPaperId[i]) && 17 == i) ) { return -2; } } //校验省份代码 if( checkCityCode(sPaperId) ) { return -3; } //校验出生日期 //验证最末的校验码 for (int i=0; i<=16; i++) { lSumQT += (sPaperId[i]-48) * R[i]; } if (sChecker[lSumQT%11] != sPaperId[17] ) { return -5; } return 0; } int main() { int rcode = 0; char *s= "111023198508126639"; rcode = Chk18PaperId(s); if(rcode) {printf("error, is a wrong id number");} else {printf("right,is a right id");} return 0; }
15位的身份证号转为18位即可按同样方法来验证(如 130321860311519 ,15位,需要补为 130321XX860311519X ,前两个XX替换为19,后一个X按规则算出来)。
上述代码中,没有加出生日期验证,这个可以自己写一个验证下出生日期。