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

