用c语言编写。身份证号码由17位数字加上一位校验码共18位组成。其中前17位为阿拉伯数字,最后一位校验位为阿拉伯数字或英文字母X(大小写都有可能)组成。 按照上面的条件,鉴别一个字符串是否可能是一个身份证号码。
时间: 2024-12-11 13:25:45 浏览: 17
在 C 语言中,编写一个函数来验证身份证号码的有效性,可以依据中国大陆身份证号码的校验规则——刘累校验算法(也称为18位数字的校验码计算)。这个算法考虑了奇偶性和数字权重,下面是一个简单的函数实现示例:
```c
#include <stdio.h>
#include <ctype.h>
// 计算第n位的校验码值
int getChecksum(int num, int n) {
int weight[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; // 权重数组
return ((num * weight[n - 1]) % 11 > 1) ? (11 - (num * weight[n - 1]) % 11) : num; // 根据余数确定校验码值
}
// 验证身份证号码
int validateID(char* id) {
if (strlen(id) != 18 || isspace(*id)) { // 检查长度和是否有空格
return 0;
}
int sum = 0, mult = 1, num;
for (int i = 0; i < 17; i++) { // 前17位处理
num = id[i] - '0'; // 转换为数字
if (i % 2 == 0) { // 偶数位加权
sum += num * mult;
} else { // 奇数位减权
sum += getChecksum(num, i);
}
mult *= 2; // 加权因子翻倍
}
// 最后一位校验码对比
int checkCode = getChecksum(sum % 11, 17); // 去掉前面的和后计算新的校验码
return checkCode == id[17] - '0' || checkCode == id[17] - 'X'; // 判断是否匹配
}
int main() {
char id[] = "123456789012345678X"; // 测试身份证号
if (validateID(id)) {
printf("%s 是有效的身份证号码.\n", id);
} else {
printf("%s 不可能是有效的身份证号码.\n", id);
}
return 0;
}
```
阅读全文