在 C 中将 char 转换为 int(cs50 中的信用)

Converting char into int in C (Credit in cs50)

我刚开始接触 C 编程并学习 CS50。我试图将从卡号生成的 char 转换为我可以求和的整数。基本上,我正在寻找 C 中 Java 的 charAt() 的等效项。

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

int main(void){

    int byTwo = 0;

    int byOne = 0;

    int sum = 0;

    string cardNumber = get_string("Card number: ");//from cs50 library

    for (int i = strlen(cardNumber)-2 ; i>0 ; i-=2)
    {
        byTwo += atoi(cardNumber[i])*2;//this is where the problem is
    }
    for (int i = strlen(cardNumber)-1 ; i>0 ; i-=2)
    {
        byOne += atoi(cardNumber[i]);//and here
    }

    sum = byTwo + byOne;

    printf("the sum is: %d " , (int)cardNumber);
    }

产生了两个编译器错误:

clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wshadow    credit.c  -lcrypt -lcs50 -lm -o credit
credit.c:18:23: error: incompatible integer to pointer conversion passing 'char' to parameter of type 'const char *'; take the address with & [-Werror,-Wint-conversion]
        byTwo += atoi(cardNumber[i])*2;
                      ^~~~~~~~~~~~~
                      &
/usr/include/stdlib.h:104:30: note: passing argument to parameter '__nptr' here
extern int atoi (const char *__nptr)
                             ^
credit.c:22:23: error: incompatible integer to pointer conversion passing 'char' to parameter of type 'const char *'; take the address with & [-Werror,-Wint-conversion]
        byOne += atoi(cardNumber[i]);//and here
                      ^~~~~~~~~~~~~
                      &
/usr/include/stdlib.h:104:30: note: passing argument to parameter '__nptr' here
extern int atoi (const char *__nptr)
                             ^
2 errors generated.

编辑:

我修复了问题并更新了格式,问题中的代码非常临时,我深表歉意。但这是我在问题之上使用 100% cs50 规范优化的代码:https://cs50.harvard.edu/x/2021/psets/1/credit/.

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

int main(void)
{
int byTwo = 0;

int byOne = 0;

int sum = 0;

//getting the card number as long integer and converting into string for easier manipulation
long number = get_long("Card number: ");
char cardNumber[256];
sprintf(cardNumber, "%ld", number);

//loops for luch's algorithm to determine the validity of the card numerically
for (int i = strlen(cardNumber) - 2 ; i >= 0 ; i -= 2)
{
    int fixed = (cardNumber[i] - '0') * 2;//issue fixed here using the accepted method

    if (fixed / 10 >= 1)
    {
        fixed = 1 + fixed % 10;
    }

    byTwo += fixed;
}

for (int i = strlen(cardNumber) - 1 ; i >= 0 ; i -= 2)
{

    byOne += (cardNumber[i] - '0');//issue also fixed here

}

sum = byTwo + byOne;

//guarding statement determining the validity of the card and the providers
if (sum % 10 != 0)
{
    printf("INVALID\n");
}
else if (sum % 10 == 0 && strlen(cardNumber) == 15 && cardNumber[0] == '3' && (cardNumber[1] == '4' || cardNumber[1] == '7'))
{
    printf("AMEX\n");
}
else if (sum % 10 == 0 && strlen(cardNumber) == 16 && cardNumber[0] == '5' && (cardNumber[1] == '1' || cardNumber[1] == '2'
         || cardNumber[1] == '3' || cardNumber[1] == '4' || cardNumber[1] == '5'))
{
    printf("MASTERCARD\n");
}
else if (sum % 10 == 0 && (strlen(cardNumber) == 13 || strlen(cardNumber) == 16) && cardNumber[0] == '4')
{
    printf("VISA\n");
}
else
{
    printf("INVALID\n");
}
}

atoi 用于将 字符串 (以空字符结尾的字符序列)转换为整数,而不是用于转换字符。

要将十进制字符转换为相应的整数,可以减去'0'(字符0的字符代码,因为十进制字符的字符代码在C规范中被定义为连续的。

因此,您应该将两个 atoi(cardNumber[i]) 替换为 (cardNumber[i] - '0')