C语言使用strtol转字符串为整数得到异常值问题咨询
问题原因
- 进制参数错误:你调用
strtol时第三个参数传了15,代表将输入字符串按照15进制解析为整数,而你的ID是十进制数值,两种进制的转换结果自然完全不同,这是最核心的错误原因。 - 文件指针变量错误:你定义的文件指针变量名为
file,但fgets调用时第三个参数写的是未定义的subor,会导致读文件逻辑异常,无法正确读取到文件中的ID内容。 - 潜在溢出风险:你的ID数值为
9403133410,大小约为94亿,已经超过了32位系统下long类型的最大值(2^31-1 = 2147483647,约21亿),如果运行环境是32位,即使用对进制也会出现溢出错误。 - 缺少错误校验逻辑:当前代码没有判断文件是否打开成功、字符串是否转换成功的逻辑,出现异常时无法快速定位问题。
解决方法
- 将
strtol的第三个参数改为10,按十进制解析字符串。 - 修正
fgets的文件指针参数为已经定义的file。 - 若需要兼容32位环境,将变量
x改为long long类型,使用strtoll函数进行转换,输出时用%lld格式符。 - 补充文件打开、转换结果的校验逻辑,以及你需要的ID整除校验逻辑。
修正后的核心代码示例
#include <limits.h> // 要引入头文件获取LLONG_MIN/LLONG_MAX定义 void get(){ FILE* file; int i = 0; char load[50]; char *nac; file = fopen("konferencny_zoznam.txt", "r"); // 补充文件打开失败校验 if (file == NULL) { printf("文件打开失败\n"); return; } // 修正文件指针参数为file while (fgets(load, sizeof load, file) != NULL){ if (i == 0){ printf("Prezenter: %s", load); } if (i == 1){ long long x = strtoll(load, &nac, 10); // 校验转换是否成功 if (nac == load) { printf("ID格式错误,无有效数字\n"); // 此处可添加自定义抛出错误的逻辑 } else if (x == LLONG_MIN || x == LLONG_MAX) { printf("ID数值超出范围\n"); // 此处可添加自定义抛出错误的逻辑 } // ID整除校验逻辑 if (x % 2 != 0) { printf("ID不符合要求,无法被2整除\n"); } if (x % 6 != 0) { printf("ID不符合要求,无法被6整除\n"); } printf("%lld", x); printf("Rodne Cislo: %s", load); } if (i == 2){ printf("Kod prezentacnej miestnosti: %s", load); } if (i == 3){ printf("Nazov prispevku: %s", load); } if (i == 4){ printf("Mena autorov: %s", load); } if (i == 5){ printf("Typ prezentovania: %s", load); } if (i == 6){ printf("Cas prezentovania: %s", load); } if (i == 7){ printf("Datum: %s", load); } if (i == 8){ printf("\n"); } i++; if (i == 9){i = 0;} } fclose(file); // 补充关闭文件的逻辑 }
内容的提问来源于stack exchange,提问作者user17277981
相关产品推荐
相关产品推荐

