【发布时间】:2019-09-21 05:13:02
【问题描述】:
我目前正在解决一个关于动态内存分配的任务,它说我应该动态分配一个整数数组,将它们以表格的形式存储在文件中,然后查找并打印这些数字的平均值。但是当它出现时打印平均值,我得到错误的结果。
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *fp=fopen("some.txt","w+");
printf("How many numbers are you going to input?\n");
int n,i;
scanf("%d",&n);
int *tab;
int sum=0;
tab=(int*)malloc(n*sizeof(int));
for(i=0;i<n && !(feof(fp));i++){
printf("Enter a number:\n");
scanf("%d",tab+i);
fprintf(fp,"%d",*(tab+i));
}
for(i=0;i<n && !(feof(fp));i++){
fscanf(fp,"%d",tab+i);
printf("%d\t",*(tab+i));
sum+=*(tab+i);
}
float mean=sum/(float)n;
printf("%f\n",mean);
free(tab);
}
这是一个示例输入,它应该打印我写入文件中的所有数字,并且作为最后的平均值,它应该打印 4.6666(对于这三个特定的输入类似这样)
How many numbers are you going to input?
3
Enter a number:
4
Enter a number:
5
Enter a number:
5
4 1.333333
【问题讨论】:
-
OT:为了便于阅读和理解:1) 请始终缩进代码。在每个左大括号“{”后缩进。在每个右大括号 '}' 之前取消缩进。建议每个缩进级别为 4 个空格。 2)单独的代码块:
forifelsewhiledo...whileswitchcasedefault通过一个空行。 3) 遵循公理:每行只有一个语句,并且(最多)每条语句有一个变量声明。 -
OT:调用
fopen()时,始终检查(!=NULL)返回值以确保操作成功。如果不成功调用:perror()将您的错误消息和系统认为错误发生的文本原因输出到stderr -
不要使用 feof 但检查 scanf 和 fscanf 返回 1(在您的情况下)
-
OT:关于:
tab=(int*)malloc(n*sizeof(int));1) 返回的类型是void*,可以分配给任何指针。强制转换只会使代码混乱,使其更难以理解、调试等。 2) 始终检查 (!-NULL) 返回值以确保操作成功。如果不成功,调用perror()将你的错误信息和系统认为错误发生的文本原因输出到stderr -
关于:
for(i=0;i<n && !(feof(fp));i++){表达式:!(foef(fp))不符合您的预期。类似的考虑存在于:for(i=0;i<n && !(feof(fp));i++){