用c语言编写函数zhuanId(char *ss)用于将一个15位的身份证号转为18位的身份证号,假设是20世纪。
时间: 2024-02-10 13:10:34 浏览: 136
C#实现的18位身份证格式验证算法
3星 · 编辑精心推荐
可以按照以下步骤编写函数zhuanId(char *ss):
1. 首先判断输入的身份证号是否符合要求,即字符串长度为15,且每个字符都是数字。若不符合要求,则返回空字符串。
2. 然后按照以下公式计算出校验码:
sum = (s[0]*7 + s[1]*9 + s[2]*10 + s[3]*5 + s[4]*8 + s[5]*4 + s[6]*2 + s[7]*1 + s[8]*6 + s[9]*3 + s[10]*7 + s[11]*9 + s[12]*10 + s[13]*5 + s[14]*8) % 11;
校验码的值可能是0-10,需要根据校验码的值选择对应的字符来替换输入的身份证号的最后一位,规则如下:
0 -> "1",1 -> "0",2 -> "X",3 -> "9",4 -> "8",5 -> "7",6 -> "6",7 -> "5",8 -> "4",9 -> "3",10 -> "2"
3. 最后将输入的身份证号的前6位加上"19",再将校验码添加到最后,即可得到18位的身份证号。
下面是完整的函数实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *zhuanId(char *ss) {
// 判断输入的身份证号是否符合要求
if (strlen(ss) != 15) {
return "";
}
for (int i = 0; i < 15; i++) {
if (ss[i] < '0' || ss[i] > '9') {
return "";
}
}
// 计算校验码
int s[15];
for (int i = 0; i < 15; i++) {
s[i] = ss[i] - '0';
}
int sum = (s[0]*7 + s[1]*9 + s[2]*10 + s[3]*5 + s[4]*8 + s[5]*4 + s[6]*2 + s[7]*1 + s[8]*6 + s[9]*3 + s[10]*7 + s[11]*9 + s[12]*10 + s[13]*5 + s[14]*8) % 11;
char code[2] = {'1', '0'};
if (sum >= 2 && sum <= 10) {
code[0] = '0' + (11 - sum);
} else if (sum == 0) {
code[0] = '1';
} else if (sum == 1) {
code[0] = '0';
} else if (sum == 11) {
code[0] = 'X';
}
// 构造18位身份证号
char *result = (char*)malloc(19 * sizeof(char));
strncpy(result, ss, 6);
result[6] = '1';
result[7] = '9';
strncpy(result+8, ss+6, 9);
result[17] = code[0];
result[18] = '\0';
return result;
}
int main() {
char *id15 = "110101680101001";
char *id18 = zhuanId(id15);
printf("%s -> %s\n", id15, id18);
free(id18);
return 0;
}
```
注意,这里为了方便使用了动态内存分配,需要在使用完返回的字符串后手动调用free()函数释放内存。
阅读全文