C语言long int读入大整数时变量值与输入不符问题排查
问题根因
错误出在输入数值的存储类型选型上:
- 你定义的
long int类型有明确的取值上限:32位环境下long int占4字节,能存储的最大正整数为2147483647(共10位);64位环境下long int占8字节,能存储的最大正整数为9223372036854775807(共19位)。你输入的测试值255678919916555247881长度为21位,已经远超long int的可表示范围,触发了有符号整数溢出,这属于C语言标准定义的未定义行为,最终变量n存储的值完全错乱,和输入值不匹配。 - 当输入值超出
%ld格式符对应类型的取值范围时,scanf函数的读取行为本身也是未定义的,不会正确解析全部输入数字,甚至不同的超长输入在溢出后可能得到完全相同的n值,就会出现你观测到的「输入不同内容、输出完全一致」的现象。
修复方法
处理任意长度的数字输入时,不要用固定宽度的整数类型存储,直接将输入作为字符串读入到字符数组中,逐位处理即可,从根源上规避整数长度限制问题。
修正后的参考代码如下:
#include <stdio.h> #include <string.h> int main() { char input[1024] = {0}; scanf("%s", input); int len = strlen(input); for (int i = 0; i < len; i++) { int cur_digit = input[i] - '0'; printf("%d: ", cur_digit); for (int j = 0; j < cur_digit; j++) { printf("%d", cur_digit); } printf("\n"); } return 0; }
补充:如果一定要用整数类型存储,可使用部分编译器提供的非标准大整数类型(比如GCC支持的
__int128),但这类类型没有通用的标准输入输出格式符支持,跨平台兼容性很差,不推荐在这类场景下使用。
内容的提问来源于stack exchange,提问作者Sara.H
相关产品推荐
相关产品推荐

