很久以前写了一个《C语言身份证信息查询系统》,如果你点击链接进去看了。

估计也会被我那磅礴大气的代码震惊到的,最近复习/学习文件操作,把代码改了改,算是对以前还不会文件操作的时候的愿望,哈哈

写代码时思路倒是挺清晰的,不过连写带改错也弄了一下午。应该没有什么错误了(如果您有兴趣测试,欢迎反馈错误信息)

代码是在Linux下写的,不知道在win下是否报错。而且感觉自己好菜啊啊啊,本以为几十行代码搞定的东西,足足用了150多行。就这样吧。废话不多说,上原理和代码

看下程序执行:

身份证验证是否非法的判断原理:

一. 将前面的身份证号码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。
五. 通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。
例如:某男性的身份证号码是34052419800101001X。我们要看看这个身份证是不是合法的身份证。
首先:我们得出,前17位的乘积和是189
然后:用189除以11得出的结果是17 + 2/11,也就是说余数是2。
最后:通过对应规则就可以知道余数2对应的数字是x。所以,这是一个合格的身份证号码。

而且,判断性别是根据第17位数字,奇数为男,偶数为女

[c]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define IDLEN 18
#define AREALEN 6
#define BIRTHLEN 8
#define FILEURL "./UserID.txt"

int LegalInput(char p[])
{
int i;
printf("Please input you ID card\n>");
fgets(p, (sizeof(char)+1)*IDLEN, stdin);

/* 判断输入数据的长度是否合法 */
if((strlen(p)-1) != IDLEN) {
printf("Error! You need input the '18' length ID card\n");
return EXIT_FAILURE;
}

/* 判断输入的前17位是否为数字 */
for(i = 0; i<IDLEN-1; i++) {
if(!isdigit(p[i])) {
printf("Error! You need input the right num\n");
return EXIT_FAILURE;
}
}

/* 判断第18位是否为数字或是字符'X|x'*/
if(!isdigit(p[IDLEN-1]) && (p[IDLEN-1] != 'x') && (p[IDLEN-1] != 'X')) {
printf("Error! You need input the right num\n");
return EXIT_FAILURE;
}

return EXIT_SUCCESS;
}

int LegalID(char p[], int q[])
{
int i, sum, remainder;

/*将输入的字符转化为数字*/
for(i = 0; i< IDLEN-1; i++)
q[i+1] = p[i] - '0';

//1,求出前17位和系数相乘的和
// 对应的系数为 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
sum = q[1]*7 + q[2]*9 + q[3]*10 + q[4]*5 + q[5]*8 + q[6]*4 + q[7]*2
+ q[8]*1 + q[9]*6 + q[10]*3 +q[11]*7 + q[12]*9 + q[13]*10
+ q[14]*5 + q[15]*8 + q[16]*4 + q[17]*2;

// 2,求余
remainder = sum % 11;

//3,余数只可能有0~10这11个结果
//对应的最后一位身份证号码为1 0 X 9 8 7 6 5 4 3 2
char tmp[12] = {'1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2'};
if(remainder == 2) {
if(p[IDLEN-1] != 'x' && p[IDLEN-1] != 'X') {
printf("Error! You need input the right num\n");
return EXIT_FAILURE;
}
}
else {
if(p[IDLEN-1] != tmp[remainder]) {
printf("Error! You need input the right num\n");
return EXIT_FAILURE;
}
}

return EXIT_SUCCESS;
}

int main(void)
{
int i, sex;
char buf[1024], *p1, *p2;
char userInput_char[IDLEN+1];
int userInput_int[IDLEN+1]; //从[1]开始使用
char userInputArea[AREALEN+1];
char userInputBirth[BIRTHLEN+1];
char tmp[AREALEN+1];
char Area[30];

FILE * fpr;
/* 打开文件 */
if((fpr = fopen(FILEURL, "r")) == NULL)
{
printf("Open file failed.\n");
return EXIT_FAILURE;
}

memset(buf, 0, sizeof(buf));

/* 判断输入是否合法 */
int ret = -1;
while(ret != EXIT_SUCCESS) {
if(LegalInput(userInput_char) == EXIT_SUCCESS)
ret = LegalID(userInput_char, userInput_int);
}

/* 保存前1-6位 地区 */
for(i = 0; i<AREALEN; i++)
userInputArea[i] = userInput_char[i];

/* 保存第7-14为 出生日期 */
int ii = 0;
for(i = AREALEN; i<AREALEN+BIRTHLEN; i++)
userInputBirth[ii++] = userInput_char[i];
userInputBirth[ii] = 0;

/* 第17位 代表性别 sex=1 男, sex=0 女*/
if((userInput_int[17] % 2) == 0)
sex = 0;
else
sex = 1;

/* 从文件中读取数据 */
while(fgets(buf, sizeof(buf), fpr) != NULL)
{
/* p1指向第一个":",p2指向第二个":" */
p1 = strstr(buf, ":");
p1++;
p2 = p1+7;

/* 获得文件中的地区ID */
for(i = 0; i< AREALEN; i++)
tmp[i] = p1[i];
tmp[i] = 0;

/* 输出所在地 */
if(strcmp(userInputArea, tmp) == 0) {
//printf("%s\n", p2);
strcpy(Area, p2);
break;
}
/* 清楚内存 */
memset(buf, 0, sizeof(buf));
}
fclose(fpr);

printf("出生地:%s", Area);
printf("出生日期:%s\n", userInputBirth);
if(sex == 1)
printf("性别:男\n");
else
printf("性别:女\n");

return 0;
}
[/c]

数据保存在文件./UserID.txt中,格式如下

[code]
:110000:北京市
:110100:北京市市辖区
:110101:北京市东城区
:110102:北京市西城区
:110103:北京市崇文区
:110104:北京市宣武区
:110105:北京市朝阳区
:110106:北京市丰台区
:110107:北京市石景山区
:110108:北京市海淀区
:110109:北京市门头沟区
[/code]

你可以网上去找程式代码,或是使用我的文件:百度网盘(可能不全,测试时发现有没有的地区)

C语言身份证信息查询系统(修改版)的更多相关文章

  1. 使用Python改写的身份证信息查询小程序

    花了几天时间过了一遍python基础.真心感觉python让世界充满了爱…先简单的使用一下python好了,拿以前写的<C语言身份证信息查询系统(修改版)>开刀~ 很多东西,不需要考虑C语 ...

  2. 老男孩Day4作业:员工信息查询系统

    1.作业需求: (1).工信息表程序,实现增删改查操作: (2).可进行模糊查询,语法至少支持下面3种:          select name,age from staff_table where ...

  3. C语言程序设计#成绩查询系统

    学生成绩管理系统 [注释]:请点赞,好人一生平[yi]安[wo]. #codeblocks程序下编写 #include<stdio.h>#include<stdlib.h>// ...

  4. [C语言]声明解析器cdecl修改版

    一.写在前面 K&R曾经在书中承认,"C语言声明的语法有时会带来严重的问题.".由于历史原因(BCPL语言只有唯一一个类型——二进制字),C语言声明的语法在各种合理的组合下 ...

  5. C语言-社保工资查询系统

    一.简述 此次程序没有涉及函数,完成工资.保险和住房公积金税前税后的查询.工资和社保公积金算法是依据最新的北京标准计算. 五险一金标准: 税率: 1.输入编号1~6查询保险,然后再选择是依据税前工资还 ...

  6. 用户信息查询系统_daoImpl

    package com.hopetesting.dao.impl;import com.hopetesting.dao.UserDao;import com.hopetesting.domain.Us ...

  7. python 写的员工信息查询

    #!/use/bin/env pythonn#_*_ coding:utf-8 _*_import timedef Bre():    while True:        Bre_falg = ra ...

  8. AJAX+jQuery+ASP实现实时验证身份证信息是否已存在---人事系统

    很多时候在网站上注册时,我们会发现,注册表单通常需要检查用户名和电子邮件地址的可用性:从而确保用户之间不拥有相同的用户名和电子邮件地址:一些网站喜欢在用户提交填写的用户信息时,做信息可用性的检查,而一 ...

  9. 【百度地图API】建立全国银行位置查询系统(五)——如何更改百度地图的信息窗口内容?

    原文:[百度地图API]建立全国银行位置查询系统(五)--如何更改百度地图的信息窗口内容? 摘要: 酷讯.搜房.去哪儿网等大型房产.旅游酒店网站,用的是百度的数据库,却显示了自定义的信息窗口内容,这是 ...

随机推荐

  1. Oracle SQL 调优健康检查脚本

    Oracle SQL 调优健康检查脚本 我们关注数据库系统的性能,进行数据库调优的主要工作就是进行SQL的优化.良好的数据架构设计.配合应用系统中间件和写一手漂亮的SQL,是未来系统上线后不出现致命性 ...

  2. RestServer 1.1发布

    具体配置方法参照第一版:http://www.cnblogs.com/devgis/p/4947191.html BUG反馈 QQ:80163278 邮箱:devgis@qq.com 淘宝:http: ...

  3. Arcgis for Javascript之featureLayer图和属性互操作性

    说明:主要实现加载FeatureLayer并显示属性表,而要实现联动属性表与地图,首先,看看实施后的效果: 显示效果 如上图所看到的,本文章主要实现了下面几个功能:1.FeatureLayer属性表的 ...

  4. Spring先进的交易管理困难剖析

    1Spring事务传播行为 所谓事务传播行为就是多个事务方法相互调用时,事务怎样在这些方法间传播.Spring支持7种事务传播行为 PROPAGATION_REQUIRED(增加已有事务) 假设当前没 ...

  5. 浅谈Hybrid技术的设计与实现(转)

    前言 随着移动浪潮的兴起,各种APP层出不穷,极速的业务扩展提升了团队对开发效率的要求,这个时候使用IOS&Andriod开发一个APP似乎成本有点过高了,而H5的低成本.高效率.跨平台等特性 ...

  6. JavaScript中的分号插入机制

    原文:JavaScript中的分号插入机制 仅在}之前.一个或多个换行之后和程序输入的结尾被插入 也就是说你只能在一行.一个代码块和一段程序结束的地方省略分号. 也就是说你可以写如下代码 functi ...

  7. zoj 3203 Light Bulb,三分之二的基本问题

    Light Bulb Time Limit: 1 Second      Memory Limit: 32768 KB Compared to wildleopard's wealthiness, h ...

  8. freemarker定义自己的标签错误(一)

    freemarker定义自己的标记 1.错误描写叙述 freemarker.core.ParseException: Token manager error: freemarker.core.Toke ...

  9. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(12)-实现用户异步登录和T4模板

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(12)-实现用户异步登录和T4模板 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建  ...

  10. Codeforces 10C Digital Root 法冠军

    主题链接:点击打开链接 #include<stdio.h> #include<iostream> #include<string.h> #include<se ...