C语言调试:数字与字符串转换及信用卡验证作业问题
代码错误汇总与修正方案
1. 核心类型转换逻辑问题
- 单个数字字符转整数无需用
atoi,atoi要求入参是合法的以\0结尾的字符串,直接对单个字符做字符 - '0'运算即可得到对应整数值,例如'5' - '0' = 5。 - 长整型
long转字符串时,sprintf的格式化符要用%ld而非%d,%d仅适配int类型,长卡号会被截断导致错误。 - 字符串转长整型可直接用
atol函数,入参为完整的数字字符串即可。
2. 代码中具体语法&逻辑错误
2.1 Company_Check函数错误
- 声明了字符数组
num但未将传入的long number转储到数组中,直接读取num[0]/num[1]读取的是未初始化的垃圾值,需先加sprintf(num, "%ld", number);完成转换。 - 语法错误:
atoi([num[1])多写了左方括号,应改为num[1] - '0'。 - 拼写错误:
fist_one应为first_one。 - 函数声明返回
string类型,但全程无返回值,反而直接调用printf,会和main函数中的打印逻辑冲突导致重复输出,可将函数返回值改为void,或者直接返回对应卡组织字符串常量。
2.2 Luhn函数错误
- 格式化符不匹配:
sprintf(num, "%d", number);改为sprintf(num, "%ld", number); - 位数统计错误:当前循环逻辑会少算一位,正确的位数统计可直接用
strlen(num)获取,无需自己写循环。 - Luhn算法核心逻辑完全错误:没有实现「从右数偶数位每一位乘2,乘积大于9则拆分个位十位相加」的步骤,仅做了普通的各位累加。
- 累加运算符错误:
sum1 =+ atoi(fot[i]);应为sum1 += 对应数字值,=+是赋值为正数,不会做累加操作。 - 入参类型错误:给
atoi传单个字符fot[i]属于非法调用,会触发内存访问错误,直接用fot[i] - '0'取数值即可。
3. 关键逻辑修正示例
3.1 Luhn算法正确实现片段
bool Luhn(long number) { char num[30]; sprintf(num, "%ld", number); int len = strlen(num); int sum = 0; // 从右往左遍历每一位 for (int i = len - 1, count = 1; i >= 0; i--, count++) { int digit = num[i] - '0'; // 偶数位(从右数第二位开始)乘2 if (count % 2 == 0) { digit *= 2; // 大于9则拆分相加,等价于digit-9 if (digit > 9) digit -= 9; } sum += digit; } // 总和模10为0则合法 return sum % 10 == 0; }
3.2 Company_Check函数修正片段
void Company_Check(long number) { char num[30]; sprintf(num, "%ld", number); int len = strlen(num); int first_two = (num[0] - '0') * 10 + (num[1] - '0'); int first_one = num[0] - '0'; if (len == 15 && (first_two == 34 || first_two == 37)) { printf("American Express\n"); } else if (len == 16 && (first_two >=51 && first_two <=55)) { printf("Mastercard\n"); } else if ((len ==13 || len ==16) && first_one ==4) { printf("Visa\n"); } else { printf("INVALID\n"); } }
内容的提问来源于stack exchange,提问作者Ignacio Balasch Sola
相关产品推荐
相关产品推荐

