相同的代码不同的结果(C编程语言)
当在CS50WebIDE中运行此代码时,会得到运行Luhn算法的预期结果,然后正确打印出所使用的信用卡类型相同的代码不同的结果(C编程语言),c,cs50,C,Cs50,当在CS50WebIDE中运行此代码时,会得到运行Luhn算法的预期结果,然后正确打印出所使用的信用卡类型 #include <stdio.h> #include <string.h> int main(void){ long ccNumber; do{ printf("Insert CC Number: \n"); scanf("%ld", &ccNumber);
#include <stdio.h>
#include <string.h>
int main(void){
long ccNumber;
do{
printf("Insert CC Number: \n");
scanf("%ld", &ccNumber);
} while (ccNumber <= 0);
long ccCopy = ccNumber;
int sum;
int count = 0;
long divisor = 10;
char result[16];
while(ccCopy > 0){
int lastDigit = ccCopy % 10;
sum = sum + lastDigit;
ccCopy = ccCopy / 100;
printf("%i\n", sum);
}
ccCopy = ccNumber / 10;
while(ccCopy > 0){
int lastDigit = ccCopy % 10;
int timesTwo = lastDigit * 2;
sum = sum + (timesTwo % 10) + (timesTwo / 10);
ccCopy = ccCopy / 100;
}
ccCopy = ccNumber;
while(ccCopy != 0){
ccCopy = ccCopy / 10;
count++;
}
for(int i = 0; i < count - 2; i++){
divisor = divisor * 10;
}
int firstDigit = ccNumber / divisor;
int firstTwo = ccNumber / (divisor / 10);
if(sum % 10 == 0){
if(firstDigit == 4 && (count == 13 || count == 16)){
strcpy(result, "VISA");
} else if((firstTwo == 34 || firstTwo == 37) && count == 15){
strcpy(result, "AMEX");
} else if((firstTwo > 50 || firstTwo < 56) && count == 16){
strcpy(result, "MASTERCARD");
} else {
strcpy(result, "INVALID");
}
}
else {
strcpy(result, "INVALID lol");
}
printf("%i\n", sum);
printf("%s\n", result);
}
这些是VSCode的结果,具有完全相同的代码副本和粘贴:
Insert CC Number:
4012888888881881,
15774464,
15774472,
15774480,
15774488,
15774496,
15774504,
15774506,
15774506,
15774553,
INVALID lol
原始代码没有在第一个循环中显示sum的printf
,而我添加了它来调试结果
这让我非常困惑,因为代码是复制和粘贴的。
sum
未初始化为0
,因此您有未定义的行为。然后,根据编译器、平台、天气情况,您会得到不同的结果。您需要初始化所有变量int sum
可以是任何值。初始化sum为0
int sum = 0;
听起来像是未定义的行为。提示:您可以使用
char*
并将指针切换到正确的标签,而不是使用result
的字符缓冲区。VS代码没有C(或任何语言)的默认编译器,支持的编译器(MSVC、GCC、MingW、Clang)的行为可能会有所不同,特别是在UBC上,不需要long int
大到足以容纳这样一个数字。一般来说,信用卡号码、电话号码和类似的“号码”最好被当作字符串而不是整数来处理。绝对棒极了。不管出于什么原因,CS50WebIDE非常乐意接受int-sum;我在VSCode中将其初始化为0,并按预期工作。谢谢你为我澄清了这么简单的事情。有些编译器在这种情况下会给出警告。
int sum = 0;