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
相关产品推荐
相关产品推荐

