C++ 18位身份证格式验证
发布网友
发布时间:2022-05-03 08:58
我来回答
共3个回答
热心网友
时间:2023-10-17 19:22
#include <iostream.h>
#include <string.h>
bool judgeday(int,int,int);
bool judgeformat(char *);
bool judge17bit(char *);
void enterID();
char input[100];
void main()
{
for(;;)
{
enterID();
if(judgeformat(input)==false||judge17bit(input)==false)
continue;
else
{
cout<<"合法身份证件!"<<endl;
break;
}
}
}
bool judgeday(int day,int mouth,int year)
{
int dayArray[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(year%400==0||year%4==0&&year%100!=0)
dayArray[1]=29;
if(day>dayArray[mouth-1])
return false;
else
return true;
}
bool judgeformat(char *str)
{
for(int i=0;i<=16;i++)
{
if(str[i]<'0'||str[i]>'9')
{
cout<<"error!非法身份证号:前17位为数字!"<<endl;
return false;
}
else
if(str[17]<'0'||str[17]>'9'&&str[17]!='X')
{
cout<<"error!非法身份证号:第十八位为数字或'X'"<<endl;
return false;
}
}
int year,mouth,day;
year=((int)str[6]-48)*1000+((int)str[7]-48)*100+((int)str[8]-48)*10+((int)str[9]-48);
mouth=((int)str[10]-48)*10+((int)str[11]-48);
day=((int)str[12]-48)*10+((int)str[13]-48);
if(year>2010||year<1910||mouth>12||judgeday(day,mouth,year)==false)
{
cout<<"error!非法身份证号:请输入正确出生年月!"<<endl;
return false;
}
return true;
}
void enterID()
{
while(1)
{
cout<<"请输入你的身份证号:";
cin>>input;
if(18!=strlen(input))
cout<<"error!非法身份证号:请输入18位ID!"<<endl;
else
break;
}
}
bool judge17bit(char *str)
{
int quan[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char jiaoyan[]={'1','0','X','9','8','7','6','5','4','3','2'};
char code17bit;
int i,sum=0,mod;
for(i=0;i<17;i++)
sum+=(str[i]-48)*quan[i];
mod=sum%11;
code17bit=jiaoyan[mod];
if (code17bit==str[17])
return true;
else
{
cout<<"error!校验码错误!"<<endl;
return false;
}
}
看看是不是你想要的,可以校验合法的出生年月,数据格式,以及身份证是否有效。
热心网友
时间:2023-10-17 19:23
用string存。比如
string abc;
abc=身份证号;
abc[n]就表示这个字符串的第n位置。然后比较
热心网友
时间:2023-10-17 19:23
将ID号存成string型id,用id.substr(7,8)取的日期,存入string型的date,然后再将date转化为对应的数字,number=strtol(date,&endpos,10)
(注:string endpos;),后面的事相信你会做了吧
热心网友
时间:2023-10-17 19:22
#include <iostream.h>
#include <string.h>
bool judgeday(int,int,int);
bool judgeformat(char *);
bool judge17bit(char *);
void enterID();
char input[100];
void main()
{
for(;;)
{
enterID();
if(judgeformat(input)==false||judge17bit(input)==false)
continue;
else
{
cout<<"合法身份证件!"<<endl;
break;
}
}
}
bool judgeday(int day,int mouth,int year)
{
int dayArray[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(year%400==0||year%4==0&&year%100!=0)
dayArray[1]=29;
if(day>dayArray[mouth-1])
return false;
else
return true;
}
bool judgeformat(char *str)
{
for(int i=0;i<=16;i++)
{
if(str[i]<'0'||str[i]>'9')
{
cout<<"error!非法身份证号:前17位为数字!"<<endl;
return false;
}
else
if(str[17]<'0'||str[17]>'9'&&str[17]!='X')
{
cout<<"error!非法身份证号:第十八位为数字或'X'"<<endl;
return false;
}
}
int year,mouth,day;
year=((int)str[6]-48)*1000+((int)str[7]-48)*100+((int)str[8]-48)*10+((int)str[9]-48);
mouth=((int)str[10]-48)*10+((int)str[11]-48);
day=((int)str[12]-48)*10+((int)str[13]-48);
if(year>2010||year<1910||mouth>12||judgeday(day,mouth,year)==false)
{
cout<<"error!非法身份证号:请输入正确出生年月!"<<endl;
return false;
}
return true;
}
void enterID()
{
while(1)
{
cout<<"请输入你的身份证号:";
cin>>input;
if(18!=strlen(input))
cout<<"error!非法身份证号:请输入18位ID!"<<endl;
else
break;
}
}
bool judge17bit(char *str)
{
int quan[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char jiaoyan[]={'1','0','X','9','8','7','6','5','4','3','2'};
char code17bit;
int i,sum=0,mod;
for(i=0;i<17;i++)
sum+=(str[i]-48)*quan[i];
mod=sum%11;
code17bit=jiaoyan[mod];
if (code17bit==str[17])
return true;
else
{
cout<<"error!校验码错误!"<<endl;
return false;
}
}
看看是不是你想要的,可以校验合法的出生年月,数据格式,以及身份证是否有效。
热心网友
时间:2023-10-17 19:23
用string存。比如
string abc;
abc=身份证号;
abc[n]就表示这个字符串的第n位置。然后比较
热心网友
时间:2023-10-17 19:23
将ID号存成string型id,用id.substr(7,8)取的日期,存入string型的date,然后再将date转化为对应的数字,number=strtol(date,&endpos,10)
(注:string endpos;),后面的事相信你会做了吧
有关Excel中18位身份证号与15位身份证号比对的问题
1、把身份证号存在A列,2、在B1写公式,=len(a1)3、拖动b1控制点向下填充,4、点击自动筛选,5、在B列,选择15,这样显示出来的数据就是15位的身份证号。
关于C语言或者PHP程序的问题,着急!!
通过一个正则表达式来判断给定的身份证号是否符合满足18位且前17位只能是数字,最后一位只能是大写X,小写x和数字这样的规则,也就是我国现行第二代身份证号码的格式规则.如果验证不通过则打印提示信息,并退出当前程序(也就是后面的程序(功能)不再执行了).如果通过了上一步的身份证格式验证之后,那么从给...