用c语言实现,编写函数zhuan实现将15位身份证转为18位;再编写函数将结果打印出来;请不要用memmove函数
时间: 2024-03-28 19:38:36 浏览: 44
好的,以下是实现代码:
```c
#include <stdio.h>
#include <string.h>
void zhuan(const char *id15, char *id18) {
// 身份证号码各位权重
const int weight[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
// 余数对应的校验码
const char check_code[] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
// 前 6 位为原始身份证号码的地区码和出生日期
strncpy(id18, id15, 6);
id18[6] = '1';
id18[7] = '9';
// 后 9 位为原始身份证号码的顺序码和校验码,顺序码前加 '1',校验码通过计算得到
for (int i = 0; i < 9; i++) {
id18[8+i] = id15[6+i];
}
int sum = 0;
for (int i = 0; i < 17; i++) {
sum += (id18[i] - '0') * weight[i];
}
id18[17] = check_code[sum % 11];
}
void print_id(const char *id) {
printf("%s\n", id);
}
int main() {
char id15[16] = "110101800101001";
char id18[19];
zhuan(id15, id18);
print_id(id18);
return 0;
}
```
函数 `zhuan` 的实现过程:
1. 将 15 位身份证号码的前 6 位(地区码和出生日期)复制到 18 位身份证号码的前 6 位;
2. 在 18 位身份证号码的第 7、8 位分别填入 '1' 和 '9',表示 20 世纪出生;
3. 将 15 位身份证号码的后 9 位(顺序码)复制到 18 位身份证号码的第 8 到 16 位;
4. 计算 18 位身份证号码的校验码,计算方法是将前 17 位身份证号码按权重相加,然后除以 11 取余数,根据余数得到对应的校验码,将校验码填入 18 位身份证号码的最后一位。
函数 `print_id` 用于打印身份证号码。
注意,由于 C 语言中没有提供直接拷贝指定长度的字符串的函数,我们使用 `strncpy` 函数来复制前 6 位身份证号码。同时,由于 `strncpy` 函数不会自动在目标字符串末尾添加 '\0',因此需要手动添加。
阅读全文