#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; |
} |
by: 发表于:2017-06-20 16:12:32 顶(0) | 踩(0) 回复
??
回复评论