趣味編程|判斷身份證號碼輸入的合法性(不用正則)

不用正則判斷身份證號碼輸入的合法性:

<code>int verifyIDCard(char* in); void info(char* id) { int n=verifyIDCard(id); switch(n) { case 0: printf("id輸入正確!\n"); break; case 1: printf("id長度不合法!\n"); break; case 2: printf("id 1-17位含有非數字的字符!\n"); break; case 3: printf("id 第18位既不是數字也不是x!\n"); break; case 4: printf("id年份輸入錯誤!\n"); break; case 5: printf("id月份輸入錯誤!\n"); break; case 6: printf("id日輸入錯誤!\n"); break; case 7: printf("id閏年日輸入錯誤!\n"); break; default: break; } } int verifyIDCard(char* in) { int year,month,day; int i; // 循環變量,也是id的第i位 if((strlen(in))!=18) // 判斷長度 return 1; if(!(in[17]>='0' && in[17]<='9'|| in[17]=='x')) // 判斷第18位 return 3; for(i=0;i<6;i++) // 判斷1-6位 if(in[i]'9') return 2; for(year=0;i<10;i++) // 判斷7-10位的年份 if(in[i]'9') return 2; else year=year*10+in[i]-'0'; // 提取出year if(year<=1900) return 4; for(month=0;i<12;i++) // 判斷11-12位的月份 if(in[i]'9') return 2; else month=month*10+in[i]-'0'; // 提取出month for(day=0;i<14;i++) // 判斷13-14位的日 if(in[i]'9') return 2; else day=day*10+in[i]-'0'; // 提取出day switch(month) // 由月判斷日的合法性 { case 1:case 3:case 5: case 7:case 8:case 10:case 12: if(day31) return 6; break; case 4:case 6: case 9: case 11: if(day30) return 6; break; case 2: if(year%4==0&&year%100!=0||year%400==0) { if(day29) return 7; } else if(day28) return 7; break; default: return 5; } for(;i<17;i++) // 判斷15-17位 if(in[i]'9') return 2; return 0; }/<code>

-End-