gpt4 book ai didi

CS50 第 1 周,信用 - 如果比较问题?整数大小限制?

转载 作者:太空宇宙 更新时间:2023-11-04 03:10:31 26 4
gpt4 key购买 nike

我是 CS50 和 C 的新手,目前正在完成第 1 周的作业“Credit”。我已经完成了大部分工作,但我遇到了一个问题,无论我觉得一个陈述应该多么真实,我的 if 比较都会将其标记为错误。我的逻辑是错误的,还是我遗漏了什么?我可以在 If 比较中使用的数字大小是否有限制?

到目前为止,这是我的代码:

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

unsigned char cardArray[20];
unsigned long creditCard;
string cardType; //String used for checking what type of credit card has been submitted.
//int remainder;
int n = 0;//Increment array position
int x = 0;

int main(void)
{

creditCard = get_long("Input: "); //Prompt user for CC
printf("%lu", creditCard);

while(creditCard > 0 && creditCard != 0) //Take CC Int and convert to Char Array for math functions
{
cardArray[n] = (creditCard % 10); //Modulus creditCard remainder
//printf("%i\n", n); //Array indices check
creditCard = (creditCard / 10); //Reduce creditCard by factor of 10
printf("%d\n", cardArray[n]);
n += 1; //increment Array indices
}

printf("Pos 15: %d\n", cardArray[15]);

//Use if >= to check size of creditCard
if(creditCard > 1000000000000 && creditCard <= 9999999999999){printf("X3: %s\n", cardType); //Check for creditCard length of 13
if(cardArray[12] == 4){
cardType = "VISA\n";
}
}else printf("X: %s\n", cardType);

if(creditCard >= 100000000000000 && creditCard <= 999999999999999){ printf("X1: %s\n", cardType);//Check for creditCard length of 15
if(cardArray[14] == 3 && (cardArray[13] == 4 || cardArray[13] == 7)){//If 15 AND starts with 34 OR 37 then set card value to American Express
cardType = "AMEX\n";
}
}else printf("X: %s\n", cardType);

if(creditCard >= 1000000000000000 && creditCard <= 9999999999999999){printf("X2: %s\n", cardType); //Check for creditCard length of 16
if(cardArray[15] == cardArray[15]){//Does it start with 4? set card value to Visa
cardType = "VISA\n";
printf("%s", cardType);
}
else printf("X: %s\n", cardType);
if(cardArray[15] == 5 && (cardArray[14] == 1 || cardArray[14] == 2 || cardArray[14] == 3 || cardArray[14] == 4 || cardArray[14] == 5)){//Does it begin with 51, 52, 53, 54, or 55? set card value to Master Card
cardType = "MASTERCARD\n";
}
}
else cardType = "INVALID\n";

printf("%s", cardType);

}

我已经用几行 printf 进行了测试,以查看我的代码的去向。如果我将比较更改为 1 == 1 之类的内容,我可以将比较标记为 true,但使用 creditCard >= 1000000000000 之类的比较将始终失败,即使我传递的是 10000000000000。

最佳答案

unsigned long在您的目标上可能是一个 32 位值。 232 = 4294967296,因此很明显,与 10000000000000 进行比较的结果始终为假。

如果您的编译器没有发出任何警告,您应该查看您的编译器设置。

更改 creditCard 的类型至 unsigned long long或更好uint64_t (在 <stdint.h> 中声明)。然后你还应该用 ULL 指定文字整数后缀,例如:

creditCard >= 100000000000000ULL

然而,实现存在严重缺陷。您将卡号作为整数获取,然后将其转换为字符串。由于您的数据类型不包含信用卡号,因此字符串和整数都不正确。信用卡号码不是算术对象,存储为整数不是一个好主意,因为更多的原因只是范围 - 即使是 uint64_t仅适用于 19 位数字 - 现在可能就足够了,但将来可能就不够了。该数字应作为字符串接收和处理。优点是您可以执行更复杂的验证,允许数字分组空间,并且不会丢失前导零数字。

规范化数字字符串(即删除空格)的字符串比较与算术比较一样有效。例如:

if( strcmp( cardNumberString, "10000000000" ) >= 0 )

实现与以下相同的结果:

if( cardNumberUnsLongLong >= 10000000000ULL )

关于CS50 第 1 周,信用 - 如果比较问题?整数大小限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56918300/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com