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

为什么strlen()统计整数转字符串的长度出错?如何正确统计整数位数

原代码不符合预期的原因
  • C语言中以0开头的整数字面量属于八进制常量,你写的01等价于十进制的1,int类型变量只会存储数值本身,不会保留前导零的信息。
  • 使用%d格式化输出int变量时,默认不会补前导零,最终转成的字符串是"1",strlen计算结果自然为1,不符合你的预期。
对应解决方案

根据你的实际需求可以选择以下三种实现方式:

场景1:需要保留输入时的前导零统计位数

直接将输入内容作为字符串处理,不要转成int类型,代码示例:

#include <stdio.h>
#include <string.h>

int main()
{
    char input[20];
    // 直接读取输入的数字字符串
    scanf("%s", input);
    // 此处可自行加校验逻辑,判断输入是否为合法数字
    printf("%d", (int)strlen(input));
    return 0;
}

如果输入01,输出结果就是2。

场景2:需要固定输出位数,不足自动补前导零

如果你的需求是不管数值大小,固定输出N位,不足的话前面补零,可以在格式化的时候指定宽度,示例代码(固定2位):

#include <stdio.h>
#include <string.h>

int main()
{
    int someInt = 1;
    char str[12];
    // %02d表示输出宽度为2,不足2位则前面补0
    sprintf(str, "%02d", someInt);
    printf("%d", (int)strlen(str));
    return 0;
}

运行后输出结果为2。

场景3:统计十进制整数的有效位数(不含前导零)

如果不需要考虑前导零,只统计数值本身的十进制位数,可以用纯数学方法实现,不需要转字符串:

#include <stdio.h>
#include <stdlib.h>

int count_digits(int num) {
    // 单独处理0的情况,0的位数为1
    if (num == 0) return 1;
    int count = 0;
    // 负数如果需要把负号算成1位,可以在此处加count++
    num = abs(num);
    while (num > 0) {
        count++;
        num /= 10;
    }
    return count;
}

int main()
{
    printf("%d", count_digits(123)); // 输出3
    printf("%d", count_digits(0)); // 输出1
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:24:00