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

C语言开发信用卡验证:大卡号逐位提取数字出错如何解决?

信用卡号存储问题的修复方案

核心问题分析

  1. 整数类型溢出:32位long int的最大值是2147483647(仅10位数字),11位及以上的信用卡号已经超出这个范围,用整数存储必然导致数值错误。
  2. 输入格式不匹配:input_cardNo是long int类型,但scanf用了%d(对应int),输入大数字时会直接溢出。
  3. 数组定义错误:代码中重复定义了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:57:36