c语言身份证号码验证

简介: 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按规则算出来)。


上述代码中,没有加出生日期验证,这个可以自己写一个验证下出生日期。

相关文章
|
6月前
|
存储 大数据 程序员
实验验证C语言中结构体与共用体的差异
实验验证C语言中结构体与共用体的差异
52 0
|
6月前
|
C语言
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
|
存储 算法 数据安全/隐私保护
虚位密码验证 保护C语言程序的数据安全性。
7位密码验证:保护C语言程序的数据安全性 密码验证是程序开发过程中保护数据安全性的重要环节。在C语言编程中,我们可以通过实现7位密码验证系统来提高程序的安全性。本文将介绍如何设计和实现这个系统,并讨论它对数据安全性的作用。
102 0
【C语言每日一题】验证尼科彻斯定理
✨✨ 题目:验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。 例如: 1^3=1 2^3=3+5 3^3=7+9+11 4^3=13+15+17+19 输入一个正整数m(m≤100),将m的立方写成m个连续奇数之和的形式输出。 注意:本题含有多组输入数据。 数据范围:1≤m≤100 链接: 题目链接
|
人工智能 算法 C#
C语言经典算法实例5:验证哥德巴赫猜想
C语言经典算法实例5:验证哥德巴赫猜想
C语言经典算法实例5:验证哥德巴赫猜想
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(下)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(下)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(下)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(上)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(上)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(上)
|
机器学习/深度学习 C语言
【C 语言】数组 ( 指针退化验证 | 计算数组大小 | #define LENGTH(array) (sizeof(array) / sizeof(*array)) )
【C 语言】数组 ( 指针退化验证 | 计算数组大小 | #define LENGTH(array) (sizeof(array) / sizeof(*array)) )
216 0
【C 语言】数组 ( 指针退化验证 | 计算数组大小 | #define LENGTH(array) (sizeof(array) / sizeof(*array)) )
|
C语言
【C 语言】数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )
【C 语言】数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )
123 0