c语言身份证号码验证
时间:2022-07-22
本文章向大家介绍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;
}
15位的身份证号转为18位即可按同样方法来验证(如 130321860311519 ,15位,需要补为 130321XX860311519X ,前两个XX替换为19,后一个X按规则算出来)。
上述代码中,没有加出生日期验证,这个可以自己写一个验证下出生日期。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 自已做动画及编写程序搞清楚最大堆的实现原理
- 一起来学演化计算-matlab基本函数strcmp num2str 字符串格式
- 一起来学matlab-matlab学习笔记8 基本绘图命令_1 图形窗口简介
- 根据barcode过滤bam文件
- biopython - 比较两个序列的相似性
- 使用阿里函数计算同步OSS增量对象到COS
- GitLab定时备份及恢复
- MySQL 的B+树索引.
- Spring全家桶的深入学习(一):Spring起步
- Spring的学习与实战
- kubernetes 安装笔记
- Spring的学习与实战(续)
- mycat数据库集群系列之数据库多实例安装
- 自已动手作图搞清楚AVL树
- 自己动手作图深入理解二叉树、满二叉树及完全二叉树