Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
相同的代码不同的结果(C编程语言)_C_Cs50 - Fatal编程技术网

相同的代码不同的结果(C编程语言)

相同的代码不同的结果(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);

当在CS50WebIDE中运行此代码时,会得到运行Luhn算法的预期结果,然后正确打印出所使用的信用卡类型

#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;