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

C语言使用strtol转字符串为整数得到异常值问题咨询

问题原因

  • 进制参数错误:你调用strtol时第三个参数传了15,代表将输入字符串按照15进制解析为整数,而你的ID是十进制数值,两种进制的转换结果自然完全不同,这是最核心的错误原因。
  • 文件指针变量错误:你定义的文件指针变量名为file,但fgets调用时第三个参数写的是未定义的subor,会导致读文件逻辑异常,无法正确读取到文件中的ID内容。
  • 潜在溢出风险:你的ID数值为9403133410,大小约为94亿,已经超过了32位系统下long类型的最大值(2^31-1 = 2147483647,约21亿),如果运行环境是32位,即使用对进制也会出现溢出错误。
  • 缺少错误校验逻辑:当前代码没有判断文件是否打开成功、字符串是否转换成功的逻辑,出现异常时无法快速定位问题。

解决方法

  1. 将strtol的第三个参数改为10,按十进制解析字符串。
  2. 修正fgets的文件指针参数为已经定义的file。
  3. 若需要兼容32位环境,将变量x改为long long类型,使用strtoll函数进行转换,输出时用%lld格式符。
  4. 补充文件打开、转换结果的校验逻辑,以及你需要的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:06:05