2009年5月27日 星期三

身分證號檢查 (C)

//===============================================================
// 20090527 知識 +
// http://tw.knowledge.yahoo.com/question/question?qid=1609052704838
// 發問者 :(天鱗 ) http://tw.knowledge.yahoo.com/my/my?show=AA01112269
//===============================================================


#include <stdio.h>
#include <stdlib.h>
// 檢查身分證號檢查碼
int verify(char * a)
{ //- A/N B/O C/P D/Q E/R F/S G/T H/U I/V J/W K/X L/Y M/Z
char IDC[] = { 10, 11, 12, 13, 14, 15, 16, 17, 34, 18, 19, 20, 21,
22, 35, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33 };
int i, chk = IDC[(a[0]&0xDF)-'A'];
chk = chk/10+chk%10*9;
for(i=1; i<9; i++)
chk += (a[i]&0x0F)*(9-i);
if (a[i]=='?') return chk;
return (chk+(a[i]&0x0F))%10==0;
}
// 檢查身分證號格式
int CheckID(char *id)
{
int i = 0;
while(id[i]!=0) i++;
if (i!=10) return -2;
int num = (id[0]&0xDF)-'A';
if (num<0 || num>25) return -3;
for(i=1; i<=9; i++)
if(id[i]<'0' || id[i]>'9')
if(i!=9 || id[i]!='?') return -4;
i = verify(id);
return i? i: -1;
}
// 檢查身分證號與顯示
int CheckShow(char *id)
{
char *msg[] = { "正確!", "不正確!", "字數不對!", "字首應為A~Z!", "字身應為0~9" };
int ret = CheckID(id);
if (ret>1) printf( "-- 檢查碼為 %d\n", (1000-ret)%10);
else printf( "--- %s\n", (ret<0)? msg[ret*-1]: msg[0]);
return (ret<0)? ret: 0;
}
// 主程式 ---
int main(int argc, char *argv[])
{
int ret=0;
if (argc>1)
for(int i=1; i<argc; ret=CheckShow(argv[i++]))
printf( "身分證號 : %s ", argv[i]);
else
while(!fflush(stdin))
{
char inp[12];
printf("\n請輸入身分證號(只輸入一個字將結束程式): ");
if (scanf("%s", inp)!=1) continue;
if (inp[1]=='\0') break;
CheckShow(inp);
}
system("pause");
return ret;
}
// ---------------------------------------

沒有留言:

張貼留言