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

C语言整数位数统计程序逻辑错误:超长输入结果异常

整数位数统计程序的异常原因分析与修复

根本问题:int类型的取值范围限制

你的程序使用int类型存储输入的数字,但在绝大多数系统中,int是32位有符号整数,它的取值范围是-2147483648到2147483647——也就是最多只能容纳10位的十进制整数。

当你输入超过10位的数字(比如示例中的20位12345678901234567890),这个数值远超出int的最大值,会触发有符号整数溢出。根据C语言标准,有符号整数溢出属于未定义行为,实际运行时编译器通常会对数值进行截断处理,导致number变量被赋予一个错误的、极小的数值(比如你的例子中,截断后的值除以10只需要1次循环就变为0,所以输出位数为1)。

另外,scanf("%d", &number)在遇到超出int范围的输入时,会直接读取失败,此时number的初始值是未定义的,后续的循环计算自然会出现错误结果。

修复方案

方案1:使用更大范围的整数类型

改用long long类型(64位有符号整数),它的取值范围是-9223372036854775808到9223372036854775807,最多可以容纳19位十进制整数,基本覆盖大多数日常场景。同时需要把scanf的格式符改为%lld,并补充对0和负数的处理(原程序输入0会输出0,不符合预期):

// Program to calculate the number of digits in an integer.
#include <stdio.h>

int main()
{
    long long number;
    int count = 0;

    printf("Enter a number: ");
    scanf("%lld", &number);

    if (number == 0) {
        count = 1;
    } else {
        // 处理负数,转换为正数统计
        if (number < 0) {
            number = -number;
        }
        while (number != 0)
        {
            number = number / 10;
            count++;
        }
    }
    printf("The number of digits in an integer is : %d", count);
    return 0;
}

方案2:以字符串形式处理输入

如果需要支持任意长度的数字(比如超过19位),可以直接将输入当作字符串处理,统计字符串中数字字符的数量(注意跳过负号):

// Program to calculate the number of digits in an integer (字符串方式)
#include <stdio.h>
#include <string.h>

int main()
{
    char num_str[100];
    int count = 0;
    int i = 0;

    printf("Enter a number: ");
    scanf("%s", num_str);

    // 跳过负号(如果输入负数)
    if (num_str[0] == '-') {
        i = 1;
    }
    // 遍历字符串统计数字长度
    while (num_str[i] != '\0') {
        count++;
        i++;
    }
    printf("The number of digits in an integer is : %d", count);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:45:34