[C] c语言身份证验证 →→→→→进入此内容的聊天室

来自 , 2020-03-14, 写在 C, 查看 114 次.
URL http://www.code666.cn/view/6547884c
  1. #include<stdio.h>
  2. #include<string.h>
  3. //校验省份代码
  4. /**
  5.      * <pre>
  6.      * 省、直辖市代码表:
  7.      *     11 : 北京  12 : 天津  13 : 河北       14 : 山西  15 : 内蒙古  
  8.      *     21 : 辽宁  22 : 吉林  23 : 黑龙江     31 : 上海  32 : 江苏  
  9.      *     33 : 浙江  34 : 安徽  35 : 福建       36 : 江西  37 : 山东  
  10.      *     41 : 河南  42 : 湖北  43 : 湖南       44 : 广东  45 : 广西      46 : 海南  
  11.      *     50 : 重庆  51 : 四川  52 : 贵州       53 : 云南  54 : 西藏  
  12.      *     61 : 陕西  62 : 甘肃  63 : 青海       64 : 宁夏  65 : 新疆  
  13.      *     71 : 台湾  
  14.      *     81 : 香港  82 : 澳门  
  15.      *     91 : 国外
  16.      * </pre>
  17.      */  
  18. const char* cityCode[35] = { "11", "12", "13", "14", "15", "21",  
  19.             "22", "23", "31", "32", "33", "34", "35", "36", "37", "41", "42",  
  20.             "43", "44", "45", "46", "50", "51", "52", "53", "54", "61", "62",  
  21.             "63", "64", "65", "71", "81", "82", "91" };
  22.            
  23.  int checkCityCode(const char* city)
  24.  {
  25.     int i = 0;
  26.    
  27.     for(i = 0; i < 35; i++ )
  28.     {
  29.         if( memcmp(cityCode[i],city,2) == 0)
  30.         { return 0;}
  31.     }
  32.     return 1;
  33.  }
  34.  
  35.  //校验一个字符是否是数字
  36. int isdigit(int c)
  37. {
  38.     return (c >= '0' && c <= '9');
  39. }          
  40. //校验出生日期 日期格式 YYYYMMDD如"19870912"
  41.  
  42. /*
  43. 身份证15位转18位原理:身份证中的年份补全,即:第六、七位之间增加“1”“9”(目前大多数是20世纪出身的),现在身份证号码位数是17位。
  44. 第18位确定:将身份证号码17位数分别乘以不同系数,为7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
  45. 将这17位数字相加除以11,得到余数。
  46. 余数只可能为0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的数为1-0-X-9-8-7-6-5-4-3-2。而这个数就是最后一位身份证号码。
  47. */
  48. /***************************************************
  49.  * 函 数 名: Chk18PaperId
  50.  *
  51.  * 函数功能: 校验18位身份证号码,15位的号码需补齐18位
  52.  *
  53.  * 输入参数:  sPaperId  身份证号
  54.  *
  55.  * 输出参数:                
  56.  *
  57.  * 返回值:   0        成功
  58.  *                       其他     失败
  59.  ****************************************************/
  60. int Chk18PaperId (char *sPaperId)
  61. {      
  62.     long lSumQT =0;    
  63.     //加权因子
  64.     int R[] ={7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
  65.     //校验码
  66.     char sChecker[11]={'1','0','X', '9', '8', '7', '6', '5', '4', '3', '2'};  
  67.     //检验长度
  68.     if( 18 != strlen(sPaperId)) return -1;
  69.     //校验数字
  70.     for (int i=0; i<18; i++)
  71.     {
  72.         if ( !isdigit(sPaperId[i]) && !(('X' == sPaperId[i] || 'x' == sPaperId[i]) && 17 == i) )
  73.         {
  74.             return -2;
  75.         }
  76.     }
  77.     //校验省份代码
  78.     if( checkCityCode(sPaperId) )
  79.     {
  80.          return -3;
  81.     }
  82.     //校验出生日期
  83.    
  84.     //验证最末的校验码
  85.     for (int i=0; i<=16; i++)
  86.     {    
  87.         lSumQT += (sPaperId[i]-48) * R[i];
  88.     }
  89.     if (sChecker[lSumQT%11] != sPaperId[17] )
  90.     {
  91.         return -5;
  92.     }    
  93.  
  94.     return 0;        
  95. }
  96.  
  97. int main()
  98. {
  99.         int rcode = 0;
  100.         char *s= "111023198508126639";
  101.         rcode = Chk18PaperId(s);
  102.         if(rcode)
  103.         {printf("error, is a wrong id number");}
  104.         else
  105.         {printf("right,is a right id");}
  106.         return 0;
  107. }

回复 "c语言身份证验证"

这儿你可以回复上面这条便签

captcha