You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50x信用卡验证代码Windows与Linux运行差异问题排查

CS50x信用卡验证代码Windows运行异常问题

问题现象

在Windows系统运行信用卡验证代码时,输入15位卡号会被反复要求重新输入,无法正常接收;但将相同代码复制到Linux环境的CS50云空间VSCode中,运行完全正常。问题出在get_long函数在Windows环境下无法处理15位卡号。

代码示例

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

int main()
{
   long number;
   
    number = get_long("Enter your card number: ");
   
   // 计算卡号长度
   int i = 0;
   long length = number;
   while (length > 0 )
   {
    length = length / 10;
    i++;
   }

    if (i != 16 && i != 15 && i!= 13)
    {
        printf ("INVALID");
    }
    else
    {
        int sum1 = 0;
        int sum2 = 0;
        long x = number;
        int mod1 = 0;
        int mod2 = 0;
        int d1 = 0;
        int d2 = 0;
        int final_sum = 0;

        do
        {
            // 取最后一位加到sum1
            mod1 = x % 10;
            x = x / 10;
            sum1 = sum1 + mod1;
            
            // 取倒数第二位
            mod2 = x % 10;
            x = x / 10;

            // 倒数第二位乘以2
            mod2 = mod2 * 2;

            // 拆分乘积的各位数字
            d1 = mod2 % 10;
            d2 = mod2 / 10;

            // 加到sum2
            sum2 = sum2 + d1 + d2;

        } while (x > 0 );

        final_sum = sum1 + sum2;
        
        // 验证卢恩算法
        if (final_sum % 10 != 0)
        {
            printf("INVALID\n");
        }
        else
        {
            long y = number;
            int j = 0;
            do
            {
                y = y / 10;
                j++;

            } while (y > 100 );

            if ( y / 10 == 4)
            {
                printf ("VISA");
            }
            else if ((y / 10 == 5) && (0 < y % 10 && y % 10 < 6))
            {
                printf("MASTERCARD");
            }
            else if ((y / 10 == 3) && (y % 10 ==4 || y % 10 == 7) )
            {
                printf("AMEX");
            }
        }
    }
}

原因分析

Windows环境中,long类型是32位,最大值为2147483647,而15位卡号的范围是100000000000000到999999999999999,其中大部分数值都超过了32位long的上限,导致输入时发生溢出,get_long会判定输入无效,因此反复要求重新输入。而Linux环境下long通常是64位,能轻松容纳15位卡号,所以运行正常。

解决方案

方案1:改用64位整数类型

将代码中所有long类型替换为long long,同时把get_long换成CS50库对应的get_long_long函数,这样在Windows和Linux下都能支持更大的数值范围,避免溢出。修改后的关键代码如下:

long long number;
number = get_long_long("Enter your card number: ");
long long length = number;
long long x = number;
long long y = number;

方案2:以字符串形式处理卡号

直接将卡号作为字符串输入,避免数值类型的限制,同时也能更方便地处理长度判断和各位数字提取,兼容所有合法长度的卡号。

内容的提问来源于stack exchange,提问作者Faraaz Hussain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:05:22