C语言开发信用卡验证:大卡号逐位提取数字出错如何解决?
信用卡号存储问题的修复方案
核心问题分析
- 整数类型溢出:32位
long int的最大值是2147483647(仅10位数字),11位及以上的信用卡号已经超出这个范围,用整数存储必然导致数值错误。 - 输入格式不匹配:
input_cardNo是long int类型,但scanf用了%d(对应int),输入大数字时会直接溢出。 - 数组定义错误:代码中重复定义了
cardNo(先long int后int),属于编译错误,正确做法是直接给已声明的数组元素赋值。
最优解决方案:用字符串处理卡号
信用卡号本质是一串数字字符,用字符串存储完全没有长度限制(只要不超过数组大小),拆分每一位也更简单,适合后续Luhn算法处理:
#include <stdio.h> #include <string.h> int main() { char card_str[21]; // 最多存储20位卡号 + 字符串结束符 int card_digits[20]; int len, i; printf("Enter your card number : "); scanf("%20s", card_str); // 限制输入长度,避免数组溢出 len = strlen(card_str); card_digits[0] = -1; // 标记卡号结束 // 将字符转成数字存入数组 for (i = 0; i < len; i++) { card_digits[i+1] = card_str[i] - '0'; // ASCII码转换,字符'0'-'9'对应数字0-9 printf("%d\n", card_digits[i+1]); } return 0; }
若坚持用整数处理(仅适合短卡号)
如果一定要用整数拆分,需修复类型匹配问题,但仅支持10位以内的卡号:
#include <stdio.h> int main() { long int cardNo[20]; long int input_cardNo; cardNo[0] = -1; // 直接赋值,无需重复声明类型 int i = 1; printf("Enter your card number : "); scanf("%ld", &input_cardNo); // 用%ld对应long int类型 do { long int remainder = input_cardNo % 10; long int division = input_cardNo / 10; cardNo[i] = remainder; printf("%ld\n", cardNo[i]); // 用%ld打印long int input_cardNo = division; i++; } while (input_cardNo != 0); return 0; }
补充说明
用字符串处理的优势:无需担心数值溢出,直接按顺序获取每一位数字,后续实现Luhn算法时,从右往左遍历也更方便(直接反向遍历字符串即可)。
内容的提问来源于stack exchange,提问作者on_my_puter
相关产品推荐
相关产品推荐

