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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:46:00