在 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')
。
我刚开始接触 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')
。