[c]代码库
#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) 回复
??
回复评论