You need to enable JavaScript to run this app. C语言计算信用卡号位数前导0导致计数错误如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

C语言计算信用卡号位数前导0导致计数错误如何解决?

解决方案

核心问题根源

你当前的实现从输入阶段就存在逻辑缺陷:使用long类型存储卡号+%ld格式符读取输入时,输入内容的前导0会被直接丢弃,根本不会存入card_num变量,因此无论怎么修改循环判断条件,都不可能统计到被丢弃的前导0位数。你修改为card_num >=0出现死循环的原因也很明确:当card_num为0时,0/10的结果永远是0,永远满足循环条件,自然不会终止。

符合要求的实现(不使用数组)

直接逐字符读取输入内容,不需要存储完整卡号,仅对数字字符计数即可,天然支持前导0统计,也不受数值类型的长度限制:

#include <stdio.h>
#include <ctype.h>

int main(void) {
    int count = 0;
    int ch;

    printf("Enter your Credit/Debit Card Number:\n");

    // 跳过输入开头的空白字符(空格、制表符、换行等)
    do {
        ch = getchar();
    } while (ch != EOF && isspace(ch));

    // 统计所有连续的数字字符数量
    while (ch != EOF && isdigit(ch)) {
        count++;
        ch = getchar();
    }

    printf("Card number length: %d\n", count);
    return 0;
}

方案优势

  • 完全满足不使用数组的要求,仅需两个临时变量即可完成统计
  • 可以统计任意长度的卡号,不会出现long类型溢出无法存储16位以上卡号的问题
  • 前导0会被正常统计,不会出现位数少算的问题
  • 自动适配输入后跟随的回车、空格等非数字结束符,不需要额外处理输入缓冲

补充说明

如果你坚持要使用数值类型存储卡号,从原理上无法解决前导0的统计问题:数值类型的存储逻辑本身就不保留前导0,输入的前导0在scanf读取阶段就被丢弃,后续代码完全感知不到前导0的存在。


内容的提问来源于stack exchange,提问作者Aditya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 06:54:08