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

