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
相关产品推荐
相关产品推荐

