8、编写身份验证程序,提示用户输入身份证号,程序先校验身份证号是否为合法身份证号(根据身份证的校验码),如果身份证号不合法,则程序拒绝解析。如果身份证号合法,则程序打印用户的 户籍地址:(如:四川省成都市) 出生年月日:(如:1997年1月2日) 性别:(如:男(假定只有两种性别))
时间: 2024-04-08 19:33:11 浏览: 126
下面是一个示例的C语言程序,实现了身份证号的合法性校验和信息提取功能。
```c
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
bool is_valid_id_card(const char* id_card) {
int factors[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
char checksums[11] = "10X98765432";
if (strlen(id_card) != 18) {
return false;
}
int sum = 0;
for (int i = 0; i < 17; i++) {
if (id_card[i] < '0' || id_card[i] > '9') {
return false;
}
sum += (id_card[i] - '0') * factors[i];
}
int checksum = sum % 11;
char expected_checksum = checksums[checksum];
return (id_card[17] == expected_checksum);
}
void extract_info(const char* id_card) {
char province[5];
strncpy(province, id_card + 0, 2);
province[2] = '\0';
char city[10];
strncpy(city, id_card + 2, 4);
city[4] = '\0';
char birth_year[5];
strncpy(birth_year, id_card + 6, 4);
birth_year[4] = '\0';
char birth_month[3];
strncpy(birth_month, id_card + 10, 2);
birth_month[2] = '\0';
char birth_day[3];
strncpy(birth_day, id_card + 12, 2);
birth_day[2] = '\0';
char gender[3];
strncpy(gender, id_card + 14, 3);
gender[2] = '\0';
printf("户籍地址:%s\n", province);
printf("出生年月日:%s年%s月%s日\n", birth_year, birth_month, birth_day);
printf("性别:%s\n", (strcmp(gender, "男") == 0) ? "男" : "女");
}
int main() {
char id_card[20];
while (true) {
printf("请输入身份证号:");
fgets(id_card, sizeof(id_card), stdin);
// 去除换行符
if (id_card[strlen(id_card) - 1] == '\n') {
id_card[strlen(id_card) - 1] = '\0';
}
if (!is_valid_id_card(id_card)) {
printf("身份证号不合法,请重新输入!\n");
} else {
break;
}
}
extract_info(id_card);
return 0;
}
```
这个程序会提示用户输入身份证号,并通过 `fgets` 函数读取用户的输入。然后,它会使用 `is_valid_id_card` 函数对身份证号进行合法性校验。校验算法使用身份证号的前17位按照规定的因子进行加权求和,然后通过校验码进行验证。
如果身份证号不合法,程序会提示用户重新输入。
一旦身份证号合法,程序将调用 `extract_info` 函数提取户籍地址、出生年月日和性别信息。该函数通过字符串截取的方式,从身份证号中分离出各个信息,并进行打印输出。
最后,程序会输出用户的户籍地址、出生年月日和性别。
希望这个程序能够满足你的需求!如果有任何问题,请随时提问。
阅读全文