使用get_all_person (struct person p[],int n),获取所有公民的出生年月和身份证校验位是否正确的函数。其中,结构体数组 p 中已经保存 n 个公民身份证和姓名,函数将从每个身份证号码中获得出生年、月、日,判定身份证校验位是否正确,并保存至结构体中。
时间: 2024-04-02 22:35:13 浏览: 77
根据身份证号获取出生日期以及年龄和性别
4星 · 用户满意度95%
好的,这是一个获取公民出生年月和身份证校验位是否正确的函数,可以使用以下代码实现:
```
#include <stdio.h>
#include <string.h>
struct person {
char name[20];
char ID[19];
int year;
int month;
int day;
};
int get_check_digit(char *s) {
int weight[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
char check_code[] = "10X98765432";
int sum = 0;
for (int i = 0; i < 17; i++) {
sum += (s[i] - '0') * weight[i];
}
return check_code[sum % 11] - '0';
}
void get_all_person(struct person p[], int n) {
for (int i = 0; i < n; i++) {
char id[19];
strcpy(id, p[i].ID);
sscanf(id, "%2d%2d%2d", &p[i].year, &p[i].month, &p[i].day);
int check_digit = get_check_digit(id);
if (check_digit != (id[17] - '0')) {
printf("%s 的身份证校验位不正确\n", p[i].name);
}
}
}
```
在这个函数中,我们首先定义了一个结构体 person,它包含了一个公民的姓名、身份证号码、出生年月日。然后我们使用了一个 get_check_digit 函数来计算身份证号码的校验位是否正确。最后,我们使用一个循环来遍历每个公民的身份证号码,并从中提取出生年月日,判定校验位是否正确,并保存到结构体中。
注意,这个函数中使用了 sscanf 函数来从身份证号码中提取出生年月日,它的格式为 %2d 表示读取两个数字,这里读取的是身份证号码中的前两个、第三个和第四个数字,分别表示出生年、月、日。
另外,这里使用了一个 get_check_digit 函数来计算校验位,它的原理是使用一个权重数组和一个校验码数组来计算身份证号码的校验位。
阅读全文