玩玩!
[code]
/*************************************************************/
/* 身份证15位转18位 */
/* by xstar.wxb */
/* @2008-08-25 */
/* 升位算法 */
/* 15位身份证号码 */
/* 6位地区码+6位出生年月日+3位顺序码(男为奇数,女为偶数) */
/* 18位身份证号码 */
/* 扩充6位出生年月日为8位出生年月日(年从2位扩充为4位) */
/* 扩充后的号码计算校验值,mod11当做第18位 */
/* 6位地区码+8位出生年月日+3位顺序码+1位校验位 */
/* 校验算法 */
/* 前17位分别乘加权值,求和,取模(mod11),通过校验列表取得 */
/* 校验位 */
/*************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*************************************************************/
/* 身份证15位转18位 */
/* 输入参数: inbuf 15位身份证号码 */
/* 输出参数: outbuf 18位身份证号码 */
/* 返 回 值: int 0 转换正常 */
/* -1 输入身份证号码位数错误 */
/*************************************************************/
int id15to18( char *inbuf, char *outbuf );
int main( int argc, char **argv )
{
char inbuf[ 32 ];
char outbuf[ 32 ];
if (argc != 2)
{
printf( "idconvert by xstar.wxb @ 2008-08-25\n\n" );
printf( "USAGE: idconvert idnum\n" );
return 0;
}
strcpy( inbuf, argv[ 1 ] );
id15to18( inbuf, outbuf );
printf( "idconvert by xstar.wxb @ 2008-08-25\n\n" );
printf( "From: %s\nTo : %s\n", inbuf, outbuf );
return 0;
}
/*************************************************************/
/* 身份证15位转18位 */
/*************************************************************/
int id15to18( char *inbuf, char *outbuf )
{
/* 和 */
int sum;
/* 各位加权值 */
int wi[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
/* 各个校验位 */
char vc[] = "10X98765432";
/* 判断长度是否符合 */
if (strlen( inbuf ) != 15)
{
return -1;
}
/* 复制地区码 */
for (int i = 0; i < 6; i++)
{
outbuf[ i ] = inbuf[ i ];
}
/* 扩充出生年 */
outbuf[ 6 ] = '1';
outbuf[ 7 ] = '9';
/* 复制剩下的位 */
for (int i = 6; i < 15; i++)
{
outbuf[ i + 2 ] = inbuf[ i ];
}
/* 求和 */
sum = 0;
for (int i = 0; i < 17; i++)
{
sum += (int)(outbuf[ i ] - '0') * wi[ i ];
}
/* 计算校验位 */
outbuf[ 17 ] = vc[ sum % 11 ];
outbuf[ 18 ] = '\0';
return 0;
}
[/code]
>> 本文固定链接: http://www.vcgood.com/archives/2658
感谢楼主啊
自学 还没有看到指针那一节!!
看起来有点困难.