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

C语言基于Luhn算法实现安全码验证的文件读取与计算问题求助

Luhn算法安全码校验C程序修复方案

核心问题排查

现有代码存在以下几类错误:

读取逻辑错误

  • main函数中fscanf(codes, "%c\n", &sc)参数类型完全不匹配,%c是读取单个字符,&sc是数组指针类型,逻辑完全冗余
  • 调用ReadSecurityCode时传入sc[20]属于数组越界访问,正确应该传入数组首地址sc
  • ReadSecurityCode返回值错误,sc[20]是数组越界元素,仅需返回读取是否成功的状态即可
  • 函数声明未显式标注返回值类型,不符合C语法规范

校验逻辑错误

  • 偶数位乘2后各位求和逻辑空缺:单个数字乘2最大为18,各位和可直接用乘积/10 + 乘积%10计算
  • 未实现最终校验规则:Luhn算法最终判断总和模10是否等于0即可得到校验结果
  • 直接修改传入的原数组sc[i] = sc[i] * 2属于不必要的操作,会污染原数组数据
  • 注意索引对应关系:若规则中的「奇数位/偶数位」是从左到右从1开始计数,C数组从0开始索引,对应规则的奇数位对应索引0,2...,偶数位对应索引1,3...,可根据实际规则调整循环起始值

修复后完整代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

// 读取安全码,成功读取1条返回1,读取失败返回0
int ReadSecurityCode(FILE* codes, int sc[]);
// 校验安全码,有效返回1,无效返回0
int isCodeValid(int sc[]);

int main(void) {
    int sc[20];
    FILE* codes = fopen("SecurityCodes.txt", "r");
    if (codes == NULL) {
        printf("文件打开失败\n");
        return 1;
    }

    int line = 1;
    // 循环读取每条安全码,自动适配任意数量的记录
    while (ReadSecurityCode(codes, sc) == 1) {
        if (isCodeValid(sc)) {
            printf("第%d条安全码校验通过\n", line);
        } else {
            printf("第%d条安全码校验不通过\n", line);
        }
        line++;
    }

    fclose(codes);
    return 0;
}

int ReadSecurityCode(FILE* codes, int sc[]) {
    int i;
    for (i = 0; i < 20; i++) {
        // 读取失败直接返回0
        if (fscanf(codes, "%d", &sc[i]) != 1) {
            return 0;
        }
    }
    return 1;
}

int isCodeValid(int sc[]) {
    int i, sumodds = 0, sumevens = 0, sumtotal;
    // 规则:1开始计数的奇数位直接累加,对应索引0,2,4...
    for (i = 0; i < 20; i = i + 2) {
        sumodds += sc[i];
    }
    
    // 规则:1开始计数的偶数位乘2后各位求和,对应索引1,3,5...
    for (i = 1; i < 20; i = i + 2) {
        int val = sc[i] * 2;
        // 统一公式计算各位和:小于10时就是本身,大于等于10时是十位加个位
        sumevens += val / 10 + val % 10;
    }

    sumtotal = sumodds + sumevens;
    // Luhn规则:总和模10等于0则有效
    return sumtotal % 10 == 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:24:03