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

C语言使用函数与数组读取文件数值求均值的代码报错求助

C语言读取文件计算均值代码错误修复

你的代码存在以下几处核心错误,是导致输出nan或数值异常的直接原因:

  • 数组类型不匹配:main函数中定义的d1、d2是int类型数组,但read_file、calc_mean函数要求传入的是double类型数组,类型不匹配会导致内存数据解析完全错乱,读取到的数值全为垃圾值。
  • 格式符使用错误:read_file函数中读取double类型变量时,fscanf使用了%d(对应int类型)格式符,应该改为%lf,错误的格式符会直接破坏double变量的内存存储结构。
  • 数组下标越界:calc_mean函数的循环逻辑错误,C语言数组下标从0开始,你设置的循环初始值为1、终止条件为i <= length,会直接访问到数组外的z[500]非法内存,求和时引入未知垃圾值,甚至触发nan。
  • 参数类型不匹配:调用read_file、calc_mean时传入的长度参数是500.0浮点数,而函数形参要求是int类型,属于不规范写法,存在隐式转换风险。
  • 缺少文件打开校验:没有判断fopen的返回值,如果目标文件不存在/打开失败,后续fscanf会全部读取失败,数组中全为未初始化的垃圾值。

修正后的完整代码如下:

#include <stdio.h>

void read_file(FILE* inp, double z[], int length);
double calc_mean(int length, double z[]);

int main(void) {
    FILE* data1;
    // 改为double类型数组
    double d1[500], d2[500];
    double x;

    data1 = fopen("data1.txt", "r");
    // 增加文件打开校验
    if (data1 == NULL) {
        printf("data1.txt打开失败,请检查文件路径");
        return 1;
    }
    FILE* data2 = fopen("data2.txt", "r");
    if (data2 == NULL) {
        printf("data2.txt打开失败,请检查文件路径");
        fclose(data1);
        return 1;
    }

    // 长度参数传整数500
    read_file(data1, d1, 500);
    x = calc_mean(500, d1);
    printf("%lf", x);

    fclose(data1);
    fclose(data2);
    return 0;
}


void read_file(FILE* inp, double z[], int length) {
    int i;
    for (i = 0; i < length; i++) {
        // 改为%lf读取double类型
        fscanf(inp, "%lf", &z[i]);
    }
}

double calc_mean(int length, double z[]) {
    double sum = 0.0;
    int i;
    // 循环改为从0开始,到length-1结束
    for (i = 0; i < length; i++) {
        sum += z[i];
    }
    return sum / length;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:15:00