CS50信用卡项目运行报错:Floating point exception (core dumped)
问题分析与修复
触发“Floating point exception (core dumped)”的核心原因
你的代码异常源于整数溢出:
validation函数里的i和j是int类型,而16位信用卡号需要i增长到10^15才能遍历目标数字,但int的最大值仅为2147483647(约2e9),远小于10^15。当i持续乘以100时,会超出int范围触发溢出,溢出后的值可能变为负数甚至0,后续循环执行number / i时会出现除以0的情况,触发浮点异常。
其他逻辑错误
除异常问题外,代码还有多处规则错误:
- Visa卡的有效位数是13或16位,你错误写成了13或14位,导致16位Visa无法被识别
- American Express的起始数字为34或37,你错误包含了35
- 信用卡通过Luhn验证但不符合任何卡种规则时,程序无输出,应输出
INVALID
修复后的代码
#include <stdio.h> #include <cs50.h> bool validation(long long number) { // 改用long long避免整数溢出 long long i = 10; long long j = 1; int totalMultiplied = 0; int totalNotMultiplied = 0; while (number / i != 0){ int digit = (number / i) % 10; int product = digit * 2; // Luhn算法要求将乘积的各位数字相加,而非直接加乘积 totalMultiplied += (product / 10) + (product % 10); i *= 100; } while (number / j != 0) { totalNotMultiplied += (number / j) % 10; j *= 100; } return ((totalMultiplied + totalNotMultiplied) % 10 == 0); } int main(void) { long long creditCardNo; do { creditCardNo = get_long("Enter credit card number: "); } while (creditCardNo < 0); int count = 0; long long startNumbers = creditCardNo; long long n = creditCardNo; do { n /= 10; count++; } while (n != 0); while (startNumbers >= 100) { startNumbers /= 10; } if (validation(creditCardNo)) { if (count == 15 && (startNumbers == 34 || startNumbers == 37)) { printf("AMEX\n"); } else if (count == 16 && (startNumbers >= 51 && startNumbers <= 55)) { printf("MASTERCARD\n"); } else if ((count == 13 || count == 16) && (startNumbers / 10 == 4)) { printf("VISA\n"); } else { // 验证通过但无匹配卡种,输出INVALID printf("INVALID\n"); } } else { printf("INVALID\n"); } }
关键修复说明
- 类型调整:将所有涉及卡号存储和位数遍历的变量改为
long long类型,确保能容纳16位信用卡号,彻底避免溢出。 - Luhn算法修正:修复了乘2后数字的累加逻辑,改为将乘积的各位数字相加,符合算法要求。
- 卡种规则修正:修正Visa位数、American Express起始数字的错误,补充验证通过但无匹配卡种时的
INVALID输出逻辑。
内容的提问来源于stack exchange,提问作者Tobi
相关产品推荐
相关产品推荐

