为什么我编写的从数组计算平均值的C语言代码编译报错?
编译报错直接原因
你遇到的编译错误expected const char but argument is of int type由printf(average);这行代码触发:
printf的第一个入参要求是const char类型的格式控制字符串,你直接传入int类型的average不符合参数类型要求,修改为printf("%d\n", average);即可解决该编译错误。
代码其余潜在问题
就算解决上述编译错误,你的代码运行也会出现异常,还需要修复以下问题:
- 缺失头文件引用:调用了
exit()函数但没有引入对应的<stdlib.h>头文件,会触发隐式声明警告,需要在代码头部加#include <stdlib.h>。 - 统计有效元素的逻辑完全错误:
weightSet是int类型数组,元素和NULL(指针常量)比较本身类型不匹配,同时未初始化的数组未读入位置的值是随机垃圾值,无法通过值判断是否为有效元素。- 内层用
while循环会导致死循环:只要weightSet[j]不为0就会反复累加同一个值,导致sum和size无限增大。 - 你在读入数据时已经用变量
i记录了有效元素的个数,直接使用i作为size即可,不需要额外写遍历判断逻辑。
- 数组越界风险:读入数据的循环没有判断
i是否超过数组最大长度10000,文件数据量超过数组容量时会出现越界写内存的问题。 - 冗余变量:定义的
int weight全程没有使用,属于无用代码。 - 整数除法截断:sum和size都是int类型,直接整除会丢弃小数部分,如果需要保留精度可以转浮点运算输出。
修复后可正常运行的代码
#include <stdio.h> #include <stdlib.h> int main(){ FILE *file; file = fopen("elephantArray.txt", "r"); if( file == NULL){ fprintf(stderr, "Can't open input file elephantArray.txt!\n"); exit(1); } int weightSet[10000]; int i = 0; // 加i < 10000判断避免数组越界 while(i < 10000 && fscanf(file, "%d\t", &weightSet[i]) != EOF){ printf("%d\n", weightSet[i]); i++; } fclose(file); int sum = 0; // 直接用i作为有效元素的数量 for(int j=0; j < i; j++){ sum += weightSet[j]; } int average = sum / i; // 修正printf参数 printf("平均值为:%d\n", average); // 如果需要保留小数可以用以下写法 // printf("平均值为:%.2f\n", (double)sum / i); return 0; }
内容的提问来源于stack exchange,提问作者ani2016
相关产品推荐
相关产品推荐

