CS50信用卡项目:部分卡号无输出问题排查求助
CS50信用卡验证程序无输出问题排查
问题根源
你的程序在Luhn校验通过但卡号不符合任何卡种规则时,没有输出任何内容,导致返回空字符串。当前逻辑仅在Luhn校验失败时输出INVALID,但校验通过但卡种不匹配的场景被遗漏,没有对应的输出分支。
代码错误分析
看main函数中的核心判断逻辑:
if (validation(creditCardNo)) { if (count == 15 && ( startNumbers == 34 || startNumbers == 37)) { printf("AMEX\n"); } else if (count == 16 && ( startNumbers == 51 || startNumbers == 52 || startNumbers == 53 || startNumbers == 54 || startNumbers == 55)) { printf("MASTERCARD\n"); } else if ((count == 13 || count == 16) && ( startNumbers / 10 == 4)) { printf("VISA\n"); } // 这里缺少分支:校验通过但卡种不匹配时输出INVALID }else { printf("INVALID\n"); }
当卡号通过Luhn校验,但既不是AMEX、MASTERCARD也不是VISA时,程序不会执行任何printf语句,因此返回空字符串,这就是check50测试失败的直接原因。
修复方案
在if (validation(creditCardNo))的代码块末尾添加一个else分支,输出INVALID,确保所有校验通过但卡种不匹配的情况都能正确输出结果。
修复后的main函数相关代码:
if (validation(creditCardNo)) { if (count == 15 && ( startNumbers == 34 || startNumbers == 37)) { printf("AMEX\n"); } else if (count == 16 && ( startNumbers == 51 || startNumbers == 52 || startNumbers == 53 || startNumbers == 54 || 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"); }
验证修复效果
修复后,以下测试用例都会正确输出INVALID:
369421438430814(校验通过但不是AMEX/MASTERCARD/VISA)4062901840(校验通过但位数不符合要求)3400000000000620(AMEX开头但位数是16位)430000000000000(VISA开头但位数是15位)
内容的提问来源于stack exchange,提问作者Tobi
相关产品推荐
相关产品推荐

