首页 > 解决方案 > C语言中的Luhn算法;使用atoi函数调试问题

问题描述

我在获取用户输入的字符串中的单个字符并将它们转换为整数时遇到问题。我使用XCode,使用atoi函数时弹出的错误是:

将“char”传递给“const char *”类型参数的指针对话不兼容的整数

然后我用 获取地址&,然后它要求我通过添加来解决问题&。然而,每当我这样做时,调试屏幕就会出现,我不知道从那里做什么。有人可以告诉我如何正确格式化吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main(void)
{
    char cardnumber[17];

    printf("Enter your card number: ");
    scanf("\n%s",cardnumber);
    
    int c;
    for (c=0; cardnumber[c]!='\0'; c++)
    {
        if (isdigit(cardnumber[c]) == 0)
        {
            printf("Invalid Entry");
        }
    }
    
    int i=0;
    int odd1 = atoi(cardnumber[i]);
    int odd2 = atoi(cardnumber[i+2]);
    int odd3 = atoi(cardnumber[i+4]);
    int odd4 = atoi(cardnumber[i+6]);
    int odd5 = atoi(cardnumber[i+8]);
    int odd6 = atoi(cardnumber[i+10]);
    int odd7 = atoi(cardnumber[i+12]);
    int odd8 = atoi(cardnumber[i+14]);
    
    int s1 = odd1*2;
    int s2 = odd2*2;
    int s3 = odd3*2;
    int s4 = odd4*2;
    int s5 = odd5*2;
    int s6 = odd6*2;
    int s7 = odd7*2;
    int s8 = odd8*2;
    
    int t1 = ((s1/10)+(s1%10));
    int t2 = ((s2/10)+(s2%10));
    int t3 = ((s3/10)+(s3%10));
    int t4 = ((s4/10)+(s4%10));
    int t5 = ((s5/10)+(s5%10));
    int t6 = ((s6/10)+(s6%10));
    int t7 = ((s7/10)+(s7%10));
    int t8 = ((s8/10)+(s8%10));
    
    int even1 = atoi(cardnumber[i+1]);
    int even2 = atoi(cardnumber[i+3]);
    int even3 = atoi(cardnumber[i+5]);
    int even4 = atoi(cardnumber[i+7]);
    int even5 = atoi(cardnumber[i+9]);
    int even6 = atoi(cardnumber[i+11]);
    int even7 = atoi(cardnumber[i+13]);
    int checkdigit = atoi(cardnumber[i+15]);
    
    int check=((t1+t2+t3+t4+t5+t6+t7+t8+even1+even2+even3+even4+even5+even6+even7)%10);
    if(check==0)
    {
        if(check==checkdigit)
        {
            printf("Your card is accepted.");
        }
        else
        {
            printf("Invalid entry.\n");
        }
    }
    else
    {
        if(10-check==checkdigit)
        {
            printf("Your card is accepted.");
        }
        else
        {
            printf("Invalid entry.\n");
        }
    }
    return 0;
}

标签: cluhn

解决方案


假设您的输入是 ASCII,所有数字字符都有连续的整数代码。因此,一旦您测试isdigit()所有字符实际上都是数字,就足以'0'从每个数字中减去字符零的代码以获得它们的数值:

int odd1 = cardnumber[i] - '0';
int odd2 = cardnumber[i+2] - '0';

...等等。


推荐阅读