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

