/* idcheck.c --- modified from Tacher's example by TA */ /* gcc idcheck.c; ./a.out */ #include #include int check(char *id); void myChop(char *id); //去掉ID最後的'\n' int main(void) { char what[][68]= { "對拉!!這是合法的身份證字號", "ㄟ..第一個字非字母", "你是第三性嗎?", "打錯拉應該是數字喔!!", "怎麼會有這麼多碼!!", "神秘數字算出來是錯的", "太短了!不足碼喔!!" }; printf("***********************************\n"); printf("******** 身份證驗證程式 ***********\n"); printf("***********************************\n"); char id[16]; while (1) { printf("請輸入身份證號碼 : \n"); fgets(id,15,stdin); myChop(id); if (id[0] == '.' || id[0] == '-' ) { break; } printf("******** 輸入 '.' 結束 **********\n"); printf("====>\n"); printf("%s\n",what[check(id)]); } // while (1) printf("********** bye! bye! **********\n"); return 0; } void myChop(char *id) { if(*id==0) return; while(*id) ++id; --id; if(*id=='\n') *id=0; return; } int check(char *id) { char code[26] = { 10, 11, 12, 13, 14, 15, 16, 17, 34, // ABCDEFGH I 18, 19, 20, 21, 22, 35, // JKLMN O 23, 24, 25, 26, 27, 28, // PQRSTU 29, 32, 30, 31, 33 // VWXYZ }; int sum = 0; // 用來計算驗證碼 int j; // for loop // 身份字號第一個字必須為英文字母 if (isalpha(id[0])) { char ktmp = toupper(id[0]); ktmp = code[ ktmp - 'A' ]; //ASCII Code '0'=48 ,'A'=65 ,'a'=97 sum += ((int) ktmp/10) + 9 * (ktmp%10); } else { return 1; } // 身份証字號第二個字為性別碼 if (id[1] != '1' && id[1] != '2') return 2; for (j = 1; j < 9; j++) { if (id[j] == 0) return 6; if (isdigit(id[j])) sum += (id[j]-'0') * (9-j); else return 3; } if (id[10] != 0 && id[10]!='\n') //第11碼不為空為太長 return 4; sum += id[9]-'0'; if (sum%10) return 5; return 0; }