#include #include //校验省份代码 /** *
 
     * 省、直辖市代码表: 
     *     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 : 国外 
     * 
*/ 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; }