运行结果:
代码:
#include <stdio.h>
//判断是否是数字字符
int isNumber(char c)
{
if(c>='0' && c<='9')
return 1;
else
return 0;
}
//11010519491231002x
//将p中的n个字符转换为数字,比如p="12345",n=2,则取前2位输出12
int trans(char* p,int n)
{
int s = 0,i;
for(i=0;i<n;i++)
{
if(isNumber(p[i]))
s = s*10 + (p[i]-'0');
else
return -1; //非数字
}
return s;
}
int main()
{
char str[20]={0};
int qz[18]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1};
int i = 0;
int year = 0,month=0,day = 0;
char* p = str; //指针指向输入的字符串
int sum = 0;
int yzm[] ={'1','0','X','9','8','7','6','5','4','3','2'};
scanf("%s",str); //得到字符串
for(i=0;i<17;i++)//处理前17个字符
{
if(isNumber(str[i])==0)//如果不是数字字符说明不合法
{
printf("wrong\n");
return 0;
}else
{
sum += (str[i] -'0') * qz[i]; //数字位乘以对应的权值求和
}
}
sum = sum%11; //求除以11的余数
year = trans(p+6,4); //得到年份
month = trans(p+10,2);//得到月
day = trans(p+12,2);//得到日
if(str[17]=='x') //将小写的x转成大写X,避免误判,因为上面字符数组中定义的是X
str[17] = 'X';
if(yzm[sum] == str[17] )
printf("correct,出生年月为: %d年%d月%d日\n",year,month,day);
else
printf("wrong\n");
return 0;
}
用字符串接收身份证号码,然后按照格式分解出各个数据项进行有效性判断和校验码生成
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!