/* check id_card  * write by sndnvaps<sndnvaps@gmail.com>* ai -> a1 , a2, a3, a4, a5, a6... a17 (a18 是校验码) 身份证前17位对应(ai)* wi -> 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 (17位)*  *  int  res = 0;*  for (i = 1; i < 17; i++) {*          res += (a[i] * w[i])*          }*     int  y = res % 11;* ** y 与 a18的对应关系**  y    { 0, 1,  2,  3, 4, 5, 6, 7, 8, 9, 10}*  a18  { 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3,  2 } -> vefiry[18] = { 1, 0, 'X', 9, 8, 7, 6, 5, 4, ,3, 2};*/#include <stdio.h>
#include <stdlib.h>
#include <string.h>int wi[17] = { 7, 9, 10, 5, 8 , 4, 2, 1, 6, 3, 7, 9 , 10, 5, 8, 4, 2};
int a18[11] = { 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2};int char2int(char n) {return (n - 48);
}int check_id(char id[17] ) {//return yint res = 0;int y;int i;for (i = 0; i < 17; i++) {res += (char2int(id[i]) * wi[i]);}y = res % 11;return y;
}int verify_id_t(int verify_id, int id_v) { //verify_id = y; id_v = a18int i;int temp; //store the i ; for (i = 0; i < 10; i++) {if (i == verify_id) {temp = a18[i];printf("a18[%d] = %d\n", i, temp);break;}}if (temp == id_v)return 1; // get it , 验证合格return 0;
}void usage() {printf("check_id_card id_card_num \n");
}int main(int argc, char *argv[]) {if (argc < 2) {usage();}char id_string[18];int id_18;int i;int y;if (strlen(argv[1]) > 18) {printf("id_card_num must be 18 bits\n");        return 0;}strncpy(id_string, argv[1], 18);id_18 = char2int(id_string[17]);id_string[17] = '\0';printf("id_18 = %d\n", id_18);y = check_id(id_string);if(verify_id_t(y, id_18) == 1) {printf("verify success\n");} else {printf("verify failed\n");}return 0;
}

转载于:https://www.cnblogs.com/sn-dnv-aps/p/3683794.html

检验身份证的正确性(C语言版本)相关推荐

  1. 检验身份证的正确性(Golang版本)

    // CheckID_card project main.go package main/** ai -> a1 , a2, a3, a4, a5, a6... a17 (a18 是校验码) 身 ...

  2. EXCEL中如何提取身份证出生日期和性别信息以及检验身份证号码的正确性

    中国居民身份证号码是一组特征组合码,原为15位,现升级为18位,其编码规则为: 15位:6位数字常住户口所在县市的行政区划代码,6位数字出生日期代码,3位数字顺序码. 18位:6位数字常住户口所在县市 ...

  3. 快速排序的两种实现方法(c语言版本)

    经过调研发现,对任意无序整数数组,快速排序有两种实现方法,这里简单阐述下思路: 思路一:随意选择一个基准元,一般选择数组的起始元或末尾元,Weiss这本书上特意搞了个算法来选择基准元,--,总之就是基 ...

  4. 十种经典排序算法精粹(c语言版本)

    下面给出这段时间我苦心研究验证过的十种经典排序算法的C语言版本,即下面的排序算法: 插入排序,shell排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,桶排序,基数排序和计数排序.整理出来以作备 ...

  5. T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@DateFirst、语言版本影响...

    CSDN 的 Blog 太滥了!无时不刻地在坏! 开始抢救性搬家 ... ... 到这里重建家园 /* T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@D ...

  6. 轻松搞定c++语言pdf_当年锤子的大爆炸,如今12个语言版本都可轻松搞定!

    第011期原创分享 作者:huber 大家好,我是Hub哥!又被Hub友们催更了. 这些天,刷抖音看到罗永浩老师的直播带货,发现了老罗的一些变化,头发少了几千根啊(瞎猜的),言行举止少了往日怼天怼地的 ...

  7. .NET中做多语言版本的心得 1

    在过去的大半年中,因为产品的模块越来越多,多语言似乎做得没有尽头了 在接下来的几天里面,我会把在.NET中做多语言版本的心得慢慢跟大家分享. 今天先说说基本要求: 1.我们使用资源文件(.resx)存 ...

  8. qsort归纳学习(c语言版本)

    qsort归纳学习(c语言版本) 参考:https://www.cnblogs.com/ForeverJoker/archive/2013/05/25/qsort-sort.html 包含在<s ...

  9. 编写一个自己的完全C语言版本的memset函数,并且评价这个实现的性能和可移植性。

    编写一个自己的完全C语言版本的memset函数,并且评价这个实现的性能和可移植性. memset这个函数的作用大致可以理解为将从指针指向的地址开始的指定字节长度的空间全部替换为指定的值.那么我们可以很 ...

最新文章

  1. c语言怎么输入学号姓名,c语言如何输入编号和姓名
  2. 汇编语言介绍,内存和总线的初步认识
  3. CTFshow 信息收集 web20
  4. The Linux Command Line读书笔记(二)
  5. 2013年最佳Android平板
  6. Hi3516A开发--目录分析
  7. Linux 命令之 passwd -- 修改用户账号密码
  8. plsql删除大量数据_一次oracle大量数据删除经历
  9. SpringMVC中转发和重定向
  10. Qt5.7 win10环境 调试器未设置问题解决
  11. 七、Django之Views
  12. 教你webm格式怎么转换成mp4
  13. linux的ib网卡驱动安装,linux安装IB网卡(mellanox)驱动
  14. 2022年 6 款最佳免费电子邮件营销软件
  15. 计算机配置内存容量怎么调,如何设置电脑虚拟内存,电脑虚拟内存设置多少最合理?...
  16. 宏源股指期货期权早评:暂未脱离震荡
  17. 问题解决:opencv imwrite图片保存为黑色
  18. Bluetooth 蓝牙介绍(四):低功耗蓝牙BLE Mesh网络 Ⅰ—— 基础概念
  19. uniapp template标签的使用记录
  20. Android学习之期末复习重点整理

热门文章

  1. 怎么查服务器的操作系统是什么,怎么查服务器什么操作系统
  2. 协议森林05 我尽力 (IP协议详解)
  3. 计算机硬盘read,电脑硬盘一直吱吱的响的解决办法
  4. 一名合格的网络工程师,我们需要掌握哪些基本知识
  5. 基于多源大数据的武汉市区域空间格局研究
  6. 人工智能的发展前景如何?做人工智能收入高吗?
  7. CEPH(详解+配置)
  8. 羊吃草-区间端点问题
  9. 抗真菌、细菌化合物库、抑制剂
  10. 51nod 1113 矩阵快速幂【裸题】【内含黑科技】