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

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

<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(day<1||day>31)
            return 6;
        break;
    case 4:case 6: case 9: case 11:
        if(day<1||day>30)
            return 6;
        break;
    case 2:
        if(year%4==0&&year%100!=0||year%400==0)
        {
            if(day<1||day>29)
                return 7;
        }
        else if(day<1 || day>28)
            return 7;
        break;
    default:
        return 5;
    }
    for(;i<17;i++)           // 判斷15-17位
        if(in[i]'9')
            return 2;
    return 0;
}/<code>

-End-


分享到:


相關文章: