本篇根据以二代身份证的校验方式是实例加深对数组及函数封装的理解
1. 第二代身份证号的组成
第二代身份证号为18位,各位数字对应了不同的信息(以下顺序从左往右):
AABBCCYYYYMMDDXXXV
其中,最后一位校验数字,是通过之前的信息计算得来,拿到一个身份证号,可以通过重新计算校验数字并与最后一位做比较,判断是否身份证号不合要求。
1. 2 校验算法
身份证校验算法的计算过程是:
- 根据各位权重,求得校验和
- 对校验和取余(11),求得校验序号
- 根据校验序号,找到对应的校验码
各位权重
身份证号从左往右各位的权重是:
以111111111111111111
举例权重的使用:校验和=1*7+1*9+1*10...
校验码表
2. 程序代码
- 实现将输入的18位字符串转换为18位int类型数组程序如下:其关键是
使用每一位的char减去ASCII的'0'即可得到对应的数字类型
#include <stdio.h>
int g_IDCard[18] = { 0 };
int g_Factor[17] = { 7, 9, 10, 5, 8,
4, 2, 1, 6, 3,
7, 9, 10, 5, 8,
4, 2 };
char Validate[11] = { '1', '0', 'X', '9', '8',
'7', '6', '5', '4', '3',
'2' };
void ConvertStr2IDAry(char* strID)
{
for (int i = 0; i < sizeof(g_IDCard) / sizeof(g_IDCard[0]) - 1; i++)
{
g_IDCard[i] = strID[i] - '0';//每一位的char减去ASCII的'0'即可得到对应的数字类型
}
}
int main(int argc, char* argv[])
{
ConvertStr2IDAry("123456789012345678");
return 0;
}
- 二代身份证号码校验
#include <stdio.h>
int g_IDCard[18] = { 0 };
int g_Factor[17] = { 7, 9, 10, 5, 8,
4, 2, 1, 6, 3,
7, 9, 10, 5, 8,
4, 2 };
char Validate[11] = { '1', '0', 'X', '9', '8',
'7', '6', '5', '4', '3',
'2' };
//根据权重计算校验和
int CalcIDCheckNumber()
{
int nRet = 0;
for (int i = 0; i < sizeof(g_IDCard) / sizeof(g_IDCard[0]) - 1; i++)
{
nRet += g_IDCard[i]*g_Factor[i];
}
return nRet % 11;
}
//输入的字符串转换为int数组
void ConvertStr2IDAry(char* strID)
{
for (int i = 0; i < sizeof(g_IDCard) / sizeof(g_IDCard[0]) - 1; i++)
{
g_IDCard[i] = strID[i] - '0';//每一位的char减去ASCII的'0'即可得到对应的数字类型
}
}
//封装校验位的比对
int IsIDNumberValidated(char* strIDNumber)
{
ConvertStr2IDAry(strIDNumber);
int nValue = CalcIDCheckNumber();
if (Validate[nValue] == strIDNumber[17])
return 1;
else
return 0;
}
int main(int argc, char* argv[])
{
if (IsIDNumberValidated("43042120090805523X"))
{
printf("校验合格\r\n");
}
else
{
printf("校验失败\r\n");
}
return 0;
}
3.学习视频地址:身份证号校验程序