如何在C语言中实现可识别正数前置0的数字位数计数器?
问题原因
当你用scanf("%d", &num)读取"05"这类带前导零的输入时,C语言会自动将其解析为整数5——整数类型本身不存储前导零的格式信息,所以后续通过整数除法统计位数的逻辑,自然只能得到1位结果,这是整数存储的特性决定的,无法通过整数运算解决。
解决方案
要统计包含前导零的数字位数,必须把输入当作字符串处理,这样才能完整保留输入的每一个字符信息。以下是两种实现方式:
方式一:严谨版(支持跳过空白、仅统计数字部分)
这种方式可以处理输入前后的空白字符,且只统计连续的数字序列长度:
#include <stdio.h> #include <string.h> #include <ctype.h> int count_digits(const char *str) { // 跳过开头的空白字符(如空格、换行) while (isspace((unsigned char)*str)) str++; // 处理空输入或全空白的情况 if (*str == '\0') return 0; // 统计连续数字字符的数量 int count = 0; while (isdigit((unsigned char)*str)) { count++; str++; } return count; } int main() { char input[100]; // 读取整行输入,确保捕获所有字符 if (fgets(input, sizeof(input), stdin) != NULL) { printf("%d\n", count_digits(input)); } return 0; }
方式二:简易版(仅适用于纯数字输入)
如果能保证输入是纯数字(无空白、无其他字符),可以直接统计字符串长度:
#include <stdio.h> #include <string.h> int main() { char input[100]; if (fgets(input, sizeof(input), stdin) != NULL) { // 移除fgets读取到的换行符 input[strcspn(input, "\n")] = '\0'; // 直接输出字符串长度 printf("%zu\n", strlen(input)); } return 0; }
关键说明
整数类型的本质是存储数值,而非数字的字符形式,因此无法保留前导零这类格式信息。只要需要统计包含前导零的位数,就必须以字符串形式处理输入。
内容的提问来源于stack exchange,提问作者Alvaro Higino
相关产品推荐
相关产品推荐

