青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++身份證號驗(yàn)證

Posted on 2008-09-01 17:41 RichardHe 閱讀(5345) 評論(11)  編輯 收藏 引用
C++身份證號驗(yàn)證
由于項(xiàng)目需要,在網(wǎng)上的例子大多數(shù)都是C#的,所以添加了這個(gè)身份證號的驗(yàn)證的C++程序,想用正則表達(dá)式,但又不會(huì),有哪個(gè)會(huì)的可以指點(diǎn)下,小弟我不勝感激啊!
可能有的地方寫的不好,歡迎指點(diǎn):
.H文件
 1#ifndef _CCHECKIDCARD_
 2#define _CCHECKIDCARD_
 3#include <string>
 4using namespace std;
 5
 6class cCheckIdCard
 7{
 8public:
 9    cCheckIdCard(void);
10    //身份證驗(yàn)證
11    bool CheckIDCard(const string& Id);
12    
13    //18位身份證驗(yàn)證
14    bool CheckIDCard18(const string& Id);
15
16    //15位身份證驗(yàn)證
17    bool CheckIDCard15(const string& Id);
18
19    //生日驗(yàn)證
20    bool   CheckDate(const string&   Year,   const string&   const Month,   const string&   Day);
21    
22    //最后一位校驗(yàn)
23    bool cCheckIdCard::VarifyCode(const string& Id);
24    
25    //實(shí)現(xiàn)身份證的15位轉(zhuǎn)18位 
26    string per15To18(const string& Id);
27
28    //獲得生日
29    string getBirthday(const string& Id);
30
31    virtual ~cCheckIdCard(void);
32
33}
;
34#endif//_CCHECKIDCARD_

CPP文件:
  1#include "cCheckIdCard.h"
  2
  3cCheckIdCard::cCheckIdCard(void)
  4{
  5}

  6
  7cCheckIdCard::~cCheckIdCard(void)
  8{
  9}

 10/// <summary>
 11/// 驗(yàn)證身份證號碼
 12/// </summary>
 13/// <param name="Id">身份證號碼</param>
 14/// <returns>驗(yàn)證成功為True,否則為False</returns>

 15bool cCheckIdCard::CheckIDCard(const string& Id)
 16{
 17    if (Id.length() == 18)
 18        {
 19            bool check = CheckIDCard18(Id);
 20            return check;
 21        }

 22        else if (Id.length()  == 15)
 23        {
 24            bool check = CheckIDCard15(Id);
 25            return check;
 26        }

 27        else
 28        {
 29            return false;
 30        }

 31}

 32
 33bool cCheckIdCard::CheckIDCard18(const string& Id)
 34{
 35    string address[] = {"11","22","35","44","53","12","23","36","45","54","13","31","37","46","61","14","32","41","50","62","15","33","42","51","63","21","34","43","52","64","65","71","81","82","91"};
 36    forint i = 0; i<= 34; i++)
 37    {
 38        if (!(Id.substr(0,2!= address[i]))
 39            break;//省份驗(yàn)證正確
 40        else if (i == 34)
 41            return false;//省份驗(yàn)證錯(cuò)誤
 42    }

 43
 44    string birth = Id.substr(68);
 45    if(!CheckDate(birth.substr(0,4), birth.substr(4,2), birth.substr(6,2)))
 46        return false;//生日驗(yàn)證錯(cuò)誤
 47
 48    if(!VarifyCode(Id))
 49        return false;//最后一位校驗(yàn)錯(cuò)誤
 50    return true;
 51}

 52
 53bool cCheckIdCard::CheckIDCard15(const string& Id)
 54{
 55    string newID = per15To18(Id);
 56
 57    if(!CheckIDCard18(newID))
 58        return false;
 59    return true;
 60}

 61
 62string cCheckIdCard::getBirthday(const string& Id)
 63{
 64    if(!CheckIDCard(Id))
 65        return "";//生日驗(yàn)證錯(cuò)誤
 66    else
 67    {
 68        string birth;
 69        if (Id.length() == 15)
 70        {
 71            string newID = per15To18(Id);
 72            birth = newID.substr(68);
 73            return birth.insert(6,"-").insert(4,"-");
 74        }

 75        else
 76            return Id.substr(6,8).insert(6,"-").insert(4,"-");
 77    }

 78}

 79
 80bool   cCheckIdCard::CheckDate(const string&   Year, const   string&   Month,   const string&   Day)
 81{
 82    int iYear  = atoi(Year.c_str());
 83    int  iMonth = atoi(Month.c_str());
 84    int iDay = atoi(Day.c_str());
 85    int   Days[12]={31,   28,   31,   30,   31,   30,   31,   31,   30,   31,   30,   31};
 86    if(iMonth<1   ||   iMonth>12)   return   false;  
 87
 88    bool   b_IsLeapYear=false;  
 89    if(iYear%4==0)    
 90    {  
 91        b_IsLeapYear=true;  
 92
 93        if(!(iYear%100==0   &&   iYear%400==0))   b_IsLeapYear=false;  
 94    }
  
 95
 96    if(b_IsLeapYear)   Days[1]=29;  
 97    else   Days[1]=28;  
 98
 99    if(iDay<0   ||   iDay>Days[iMonth-1])   return   false;  
100
101    return   true;  
102}
   
103
104bool cCheckIdCard::VarifyCode( const string& Id)
105{
106    char perIDSrc[19];
107    strcpy(perIDSrc,Id.c_str());
108    int iS = 0;
109    int const iW[]={7910584216379105842};
110    char const  LastCode[]="10X98765432";
111
112    for(int i=0;i<17;i++)
113    {
114        iS += (int)(perIDSrc[i]-'0'* iW[i];
115    }

116
117    int iY = iS%11;
118    char   ch   =   LastCode[iY];  
119    string   lastChar;  
120    lastChar.insert(lastChar.begin(),   ch   );   
121    
122    if(lastChar != Id.substr(17,1))
123        return false;
124    return true;
125}
 
126
127//實(shí)現(xiàn)身份證的15位轉(zhuǎn)18位
128string cCheckIdCard::per15To18(const string& Id)
129{
130    if(Id.length() != 15)
131        return "";
132    char perIDSrc[19];
133    strcpy(perIDSrc,Id.c_str());
134    int iS = 0;
135
136    //加權(quán)因子常數(shù)
137    int const iW[]={7910584216379105842};
138    //校驗(yàn)碼常數(shù)
139    char const LastCode[]="10X98765432";
140    //新身份證號
141    char perIDNew[19];
142
143    forint i = 0; i < 6; i++ )
144    {
145        perIDNew[i] = perIDSrc[i];
146    }

147
148    //填在第6位及第7位上填上‘1’,‘9’兩個(gè)數(shù)字
149    perIDNew[6= '1';
150    perIDNew[7= '9';
151
152    forint i = 8; i < 17; i++ )
153    {
154        perIDNew[i] = perIDSrc[i - 2];
155    }

156
157    //進(jìn)行加權(quán)求和
158    forint i=0; i<17; i++)
159    {
160        iS += (perIDNew[i]-'0'* iW[i];
161        /**//*
162        對于perIDNew[i]-'0'解釋一下:
163            perIDNew[i]->ASCII碼,取得它的值實(shí)際是十進(jìn)制數(shù);
164            '0' ->ASCII碼,同上;
165            perIDNew[i]-'0' -> 得到具體的十進(jìn)制數(shù)值;
166            對于這里面的為什么會(huì)進(jìn)行轉(zhuǎn)換,具體去看C++PRIMER,呵呵。
167          */

168    }

169    
170    //取模運(yùn)算,得到模值
171    int iY = iS%11;
172    //從LastCode中取得以模為索引號的值,加到身份證的最后一位,即為新身份證號。
173    perIDNew[17= LastCode[iY];
174    //加上結(jié)束符
175    perIDNew[18= '\0';
176
177    string tempstr = perIDNew;
178    return tempstr;
179}
 

測試:
#include "stdafx.h"
#include 
"cCheckIdCard.h"
#include 
<iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    cCheckIdCard tempID;
    
bool b = tempID.CheckIDCard("");//身份證號

    
string birthday = tempID.getBirthday("12345678901234567");//12345678901234567表示你要驗(yàn)證的身份證號
    cout << birthday << endl;
    
return 0;
}

Feedback

# re: C++身份證號驗(yàn)證  回復(fù)  更多評論   

2008-09-01 18:29 by 陳梓瀚(vczh)
nnnnnnyyyymmddnnn(n|x)
這個(gè)不是正則表達(dá)式
n代表0-9
yyyymmdd代表合法日期
x代表字符'x'

很好判斷的吧,那么整齊的設(shè)計(jì)。

# re: C++身份證號驗(yàn)證  回復(fù)  更多評論   

2008-09-01 18:30 by 陳梓瀚(vczh)
用正則表達(dá)式判斷合法日期無論從開發(fā)成本、運(yùn)行成本來說都是得不償失的。不過其實(shí)是可以的。

# re: C++身份證號驗(yàn)證  回復(fù)  更多評論   

2008-09-01 19:11 by RichardHe
@陳梓瀚(vczh)
不是很明白,可以有個(gè)詳細(xì)的說明嗎?或者寫個(gè)正則表達(dá)式的身份證號驗(yàn)證程序吧!
謝謝!

# re: C++身份證號驗(yàn)證  回復(fù)  更多評論   

2008-09-01 21:25 by adcx
boost::Regex,自己看下資料

# re: C++身份證號驗(yàn)證  回復(fù)  更多評論   

2008-09-03 15:11 by RichardHe
@adcx
看是可以看,但就是不會(huì)用啊,哥哥!

# re: C++身份證號驗(yàn)證  回復(fù)  更多評論   

2008-09-04 10:40 by 崔友志
代碼寫的很清晰啊

# re: C++身份證號驗(yàn)證  回復(fù)  更多評論   

2008-09-04 13:14 by RichardHe
@崔友志
呵呵..謝謝!!!

# re: C++身份證號驗(yàn)證  回復(fù)  更多評論   

2008-09-04 13:21 by winzheng
不支持二代身份證校驗(yàn)!!!

# re: C++身份證號驗(yàn)證  回復(fù)  更多評論   

2008-09-04 21:29 by RichardHe
@winzheng
不會(huì)吧哥們..號碼是統(tǒng)一的啊...第一代的號和第二代的號難道不一樣?

不可能吧..每個(gè)人的號一上戶口就有了的..固定了的呢!

# re: C++身份證號驗(yàn)證  回復(fù)  更多評論   

2008-09-05 10:21 by linxp
CheckDate出錯(cuò),判斷閏年時(shí)

# re: C++身份證號驗(yàn)證  回復(fù)  更多評論   

2008-09-05 11:01 by RichardHe
@linxp
CheckDate哪錯(cuò)了啊??

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


posts - 94, comments - 138, trackbacks - 0, articles - 94

Copyright © RichardHe

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲麻豆一区| 香蕉久久一区二区不卡无毒影院| 国产精品人人做人人爽人人添| 久久在线视频| 先锋影音一区二区三区| 亚洲精品一区二| 欧美第一黄网免费网站| 久久99在线观看| 亚洲一区三区电影在线观看| 日韩天堂av| 亚洲国产精品一区二区久| 国产欧美综合在线| 国产精品美女主播在线观看纯欲| 欧美激情综合五月色丁香小说| 久久精品在线视频| 欧美一区二区精品在线| 亚洲少妇最新在线视频| 艳妇臀荡乳欲伦亚洲一区| 亚洲人成人99网站| 亚洲国产精品va在看黑人| 欧美 日韩 国产一区二区在线视频| 久久九九久精品国产免费直播| 亚洲综合999| 亚洲欧美日韩久久精品 | 免费看黄裸体一级大秀欧美| 欧美在线视屏| 香蕉成人伊视频在线观看| 亚洲午夜久久久久久久久电影网| 一区二区高清视频| 99亚洲伊人久久精品影院红桃| 亚洲国产婷婷综合在线精品| 在线精品视频一区二区三四| 在线观看欧美亚洲| 亚洲福利av| 亚洲欧洲日产国产综合网| 亚洲韩日在线| 一本久久精品一区二区| 国产精品99久久久久久人| 亚洲一区二区不卡免费| 亚洲男女自偷自拍图片另类| 欧美一区二区三区成人| 久久久久久黄| 欧美成人福利视频| 最新成人av网站| 一区二区三区成人| 午夜精品美女自拍福到在线| 久久成年人视频| 久久久美女艺术照精彩视频福利播放| 久久久久中文| 欧美精品免费看| 欧美午夜性色大片在线观看| 国产精品一区久久久久| 国内自拍视频一区二区三区| 亚洲国内在线| 亚洲网站在线播放| 久久精品水蜜桃av综合天堂| 欧美成人69| 99在线热播精品免费| 午夜欧美大尺度福利影院在线看| 久久久久久久久久看片| 欧美电影资源| 国产女主播一区二区三区| 永久免费精品影视网站| 99视频在线精品国自产拍免费观看| 亚洲欧美国产三级| 暖暖成人免费视频| 一区二区三区鲁丝不卡| 久久久久se| 欧美日韩午夜精品| 国产一区二区精品久久91| 亚洲欧洲在线看| 午夜一区不卡| 欧美激情一区三区| 亚洲一区二区欧美| 免费欧美在线视频| 国产精品久久久久久久久久直播 | 欧美一区二区日韩一区二区| 免费国产一区二区| 国产精品视频导航| 亚洲国产精品一区制服丝袜 | 国产精品视频免费在线观看| 在线观看av不卡| 亚洲欧美日韩国产中文| 欧美高清视频在线播放| 亚洲欧美国产另类| 欧美精品v日韩精品v国产精品| 国产区精品在线观看| 99精品国产99久久久久久福利| 久久久久国产精品麻豆ai换脸| 日韩视频一区二区在线观看 | 欧美日韩在线免费视频| 韩日精品视频一区| 香蕉乱码成人久久天堂爱免费 | 性做久久久久久久免费看| 欧美激情2020午夜免费观看| 激情久久综艺| 欧美亚洲自偷自偷| 亚洲美女视频网| 麻豆国产精品一区二区三区| 国产三级精品三级| 亚洲欧美99| 亚洲精品视频在线| 美女精品在线| 亚洲成在线观看| 国产精品一二| 国产日韩欧美精品| 亚洲自拍偷拍网址| 久久久久成人网| 亚洲影视在线播放| 欧美三级视频| 99国产精品99久久久久久| 久久在线91| 久久都是精品| 国产亚洲综合精品| 欧美一区久久| 亚洲欧美久久| 国产精品午夜国产小视频| 亚洲一区二区三区四区视频| 亚洲精品乱码久久久久| 欧美精品一卡二卡| 亚洲美女色禁图| 欧美激情黄色片| 免费成人av在线看| 亚洲黑丝在线| 欧美成人在线免费观看| 久久这里只精品最新地址| 狠狠综合久久| 免费看精品久久片| 久久精品在线播放| 亚洲第一毛片| 亚洲国产成人精品女人久久久 | 久久精品国产96久久久香蕉| 韩日欧美一区二区| 狠狠色香婷婷久久亚洲精品| 日韩视频在线一区二区三区| 免费亚洲视频| 日韩视频中文| 99v久久综合狠狠综合久久| 欧美日韩一二三区| 亚洲欧美激情诱惑| 亚洲免费在线| 国内精品国产成人| 欧美高清视频| 欧美日韩aaaaa| 亚洲欧美一区二区视频| 亚洲欧美日韩成人高清在线一区| 国产视频精品xxxx| 欧美xx69| 欧美日韩国产黄| 亚洲欧美视频一区二区三区| 性欧美超级视频| ●精品国产综合乱码久久久久| 亚洲国产欧美一区二区三区久久 | 欧美激情中文字幕一区二区| 9色国产精品| 亚洲欧美国产高清| **欧美日韩vr在线| 日韩写真在线| 国产一区二区三区不卡在线观看| 一区二区三区视频在线观看| 亚洲国产成人av在线| 欧美日韩一二三区| 久久国产色av| 欧美成人乱码一区二区三区| 亚洲一区二区在线看| 久久超碰97人人做人人爱| 亚洲开发第一视频在线播放| 亚洲伊人第一页| 91久久极品少妇xxxxⅹ软件| 一个色综合av| 在线观看欧美| 亚洲午夜免费视频| 在线观看亚洲视频啊啊啊啊| 日韩亚洲视频| 影音先锋久久| 亚洲视频观看| 亚洲人成网站999久久久综合| 亚洲一区久久| 亚洲精品在线三区| 久久精品91久久久久久再现| 9l国产精品久久久久麻豆| 欧美在线观看视频一区二区| 一区二区激情小说| 久久久久88色偷偷免费| 亚洲在线观看免费视频| 免费观看日韩av| 久久国产欧美日韩精品| 欧美日韩系列| 亚洲国产激情| 国内精品久久久久久影视8 | 久久夜色精品国产欧美乱| 欧美岛国在线观看| 欧美一区二区精品在线| 欧美激情视频在线播放| 久久精品久久综合| 国产精品国产三级国产aⅴ浪潮| 欧美大片在线观看一区| 国产一区二区视频在线观看| 一区二区高清视频在线观看| 99国产精品99久久久久久|