C语言基础入门48篇_26_身份证号校验程序(以身份证的校验方式是实例加深对数组及函数封装的理解、字符-‘0‘得到字符对应的int类型数字)

本篇根据以二代身份证的校验方式是实例加深对数组及函数封装的理解

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.学习视频地址:身份证号校验程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值