Luhn算法信用卡校验函数异常求助:始终返回true及printf无输出
信用卡Luhn算法校验函数问题排查与修复
遇到的问题
- 实现的Luhn算法校验函数始终返回
true - 调试用的
printf语句完全没有输出 - 不确定代码中两次声明
digits变量是否合规 - 编译器提示main函数中
digits未初始化、未声明的错误
代码问题分析
1. 变量作用域与赋值问题
两次声明digits是合规的,因为它们分别在main函数和number_of_digits函数的局部作用域内,是完全独立的变量。但核心问题是:main函数里没有接收number_of_digits的返回值,导致传入luhns_algorithm的digits是初始值0。这直接让循环条件i < digits/2不成立,循环体完全不执行——sum保持0,printf自然没输出,同时sum/10 == 0永远为真,函数必然返回true。
2. Luhn算法逻辑错误
原代码的求和逻辑完全不符合Luhn规则,正确的Luhn算法步骤是:
- 从卡号最右侧开始,每隔一位(偶数位)的数字乘以2,将乘积的每一位数字相加
- 剩下的奇数位数字直接相加
- 最终总和模10等于0时,卡号才有效
3. main函数调用错误
number_of_digits(card)的返回值没有赋值给main里的digits变量,导致校验函数拿到的是未正确初始化的无效值。
修复后的代码
#include <stdio.h> #include <cs50.h> bool luhns_algorithm(long, int); int number_of_digits(long); int main(void) { long card = get_long("credit card: "); // 接收number_of_digits的返回值,正确获取卡号长度 int digits = number_of_digits(card); luhns_algorithm(card, digits); } int number_of_digits(long card) { int digits = 0; do { digits++; card = card / 10; } while (card != 0); printf("卡号位数:%i\n", digits); return digits; } bool luhns_algorithm(long card, int digits) { int sum = 0; long temp = card; // 先处理从右数的偶数位(需要乘2的位) for (int i = 0; i < digits; i++) { long digit = temp % 10; temp = temp / 10; // 偶数位(i从0开始,第2、4...位) if (i % 2 == 1) { digit *= 2; // 把乘积的各位相加,比如14拆成1+4 sum += (digit / 10) + (digit % 10); } else { // 奇数位直接加 sum += digit; } } printf("总和:%i\n", sum); if (sum % 10 == 0) { printf("VALID\n"); return true; } printf("INVALID\n"); return false; }
内容的提问来源于stack exchange,提问作者lookingforhelp
相关产品推荐
相关产品推荐

