C语言运用结构体 指针函数写一个简单程序 int checkID(char *ID);并做注解 (7分) 判别身份证校验位是否正确的函数。其中参数 ID 代表一个 18 位身份证号,如果校验位正确,函数返回 1,否则返回 0。
时间: 2024-03-04 13:51:14 浏览: 72
好的,我来给您讲解一下。
首先,我们需要明确一下身份证号码的校验规则。身份证号码的最后一位是校验位,是根据前面 17 位计算得出的。具体的计算方法是:
1. 将身份证号码前 17 位分别乘以对应的系数(系数从左到右依次为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2)。
2. 将上述结果相加得到一个数。
3. 用上述结果除以 11,得到的余数就是校验位对应的数字。余数为 0 则校验位为 1,余数为 1 则校验位为 0,余数为 2 则校验位为 X,余数为 3~10 则校验位为对应的数字(例如余数为 3,则校验位为 3)。
接下来,我们就可以根据上述规则来写代码了。具体的实现方式是:将身份证号码前 17 位分别存入一个结构体中的数组中,并定义一个指向该结构体的指针,然后编写一个函数 checkID,该函数接受一个 char 类型的指针作为参数,指向身份证号码的字符串,返回值为 int 类型,表示校验位是否正确。
下面是代码实现及注释:
```c
#include <stdio.h>
struct ID {
int num[17]; // 存储身份证号码前 17 位
};
int checkID(char *ID) {
int i, sum = 0, mod; // sum 存储前 17 位乘以系数后的结果之和,mod 存储 sum 对 11 取余的结果
struct ID id; // 定义一个 ID 类型的结构体
int *p = id.num; // 定义一个指向 id.num 数组的指针
// 将身份证号码前 17 位转换成数字并存储到 id.num 数组中
for (i = 0; i < 17; i++) {
*(p + i) = *(ID + i) - '0';
}
// 计算前 17 位乘以系数后的结果之和
for (i = 0; i < 17; i++) {
sum += *(p + i) * (i % 2 == 0 ? 7 : (i % 2 == 1 ? 9 : 0));
}
// 计算 sum 对 11 取余的结果
mod = sum % 11;
// 判断校验位是否正确并返回相应的值
if (mod == 0 && *(ID + 17) == '1') {
return 1;
} else if (mod == 1 && *(ID + 17) == '0') {
return 1;
} else if (mod == 2 && *(ID + 17) == 'X') {
return 1;
} else if (mod >= 3 && mod <= 10 && *(ID + 17) == mod + '0') {
return 1;
} else {
return 0;
}
}
int main() {
char ID[18] = "11010119900307663X"; // 测试用的身份证号码
if (checkID(ID)) {
printf("校验位正确!\n");
} else {
printf("校验位错误!\n");
}
return 0;
}
```
希望对您有所帮助!
阅读全文