本程序输入读入任意天数的浮点温度记录值,每天有6个记录,最后输入每天的平均值及每天的温度记录。请问,我输入3天的数据运行正常,为什么输入4天的数据运行就不正常了。多谢解答。
#define STDC_WANT_LIB_EXT1 1
#include
#include
#include
#include
#define BUF_LEN 100
#define READING_PER_DAY 6
#define INCR 1
int main(void)
{
char buf[BUF_LEN];
char *pstr=NULL;
char *ptr=NULL;
size_t day=0;
size_t capacity=0;
double **temperature=NULL;
double *result=NULL;
double average=0;
printf("Please enter 6 records of temperature for eachday.\n");
while(true)
{
pstr=fgets(buf,BUF_LEN,stdin);
if(!pstr)
{
printf("Error reading input.\n");
return 1;
}
if(*pstr=='\n')
break;
if(day==capacity)
{
capacity+=INCR;
temperature=realloc(temperature,capacity*sizeof(double*));
result=realloc(result,capacity*sizeof(double));
}
*(temperature+day)=malloc(READING_PER_DAY*sizeof(double));
for(size_t i=0;;++i)
{
temperature[day][i]=strtod(pstr,&ptr);
if(pstr==ptr)
break;
else
pstr=ptr;
if(i>READING_PER_DAY)
{
printf("Please enter less than 6.\n");
return 3;
}
}
for(size_t j=0;j<READING_PER_DAY;++j)
{
result[day]+=temperature[day][j];
}
result[day]/=READING_PER_DAY;
day++;
}
for(size_t k=0;k<day;++k)
{
average+=result[k];
}
average/=day;
for(size_t k=0;k<day;++k)
{
printf("Day %zd %.1f ",k+1,result[k]);
for(size_t m=0;m<READING_PER_DAY;++m)
printf("%-5.1f ",temperature[k][m]);
printf("\n");
free(temperature[k]);
temperature[k]=NULL;
}
free(result);
result=NULL;
free(temperature);
temperature=NULL;
printf("\n%.1f\n",average);
return 0;
}
*(temperature+day)=malloc(READING_PER_DAY*sizeof(double));
开辟新的空间没有初始化。
你是怎样输入的?输入的数据有哪些?错误是什么样的?做个截图发上来,看看。
如果没有问题,请及时点击采纳结贴。
#include"stdio.h"
#include <stdlib.h>
#define STDC_WANT_LIB_EXT1 1
#define BUF_LEN 100
#define READING_PER_DAY 6
#define INCR 1
int main(void)
{
char buf[BUF_LEN];
char *pstr=NULL;
char *ptr=NULL;
size_t day=0;
size_t capacity=0;
double **temperature=NULL;
double *result=NULL;
double average=0;
printf("Please enter 6 records of temperature for eachday.\n");
while(true)
{
pstr=fgets(buf,BUF_LEN,stdin);
if(!pstr)
{
printf("Error reading input.\n");
return 1;
}
if(*pstr=='\n')
break;
if(day==capacity)
{
capacity+=INCR;
temperature=(double **)realloc(temperature,capacity*sizeof(double*));//修改,增加类型转换
result=(double *)realloc(result,capacity*sizeof(double));//修改,增加类型转换
}
temperature[day]=(double *)malloc(READING_PER_DAY*sizeof(double));//修改,增加类型转换
for(size_t i=0;i<6;++i) //修改
{
temperature[day][i]=strtod(pstr,&ptr);//i=6时,破坏堆内存
if(pstr==ptr)
break;
else
pstr=ptr;
if(i>READING_PER_DAY)
{
printf("Please enter less than 6.\n");
return 3;
}
}
result[day]=0;//增加
for(size_t j=0;j<READING_PER_DAY;++j)
{
result[day]+=temperature[day][j];
}
result[day]/=READING_PER_DAY;
day++;
}
average=0;
for(size_t k=0;k<day;++k)
{
average+=result[k];
}
if(day>0) average/=day;//修改
for(size_t k=0;k<day;++k)
{
printf("Day %2d: %.1f ",k+1,result[k]);//%zd改为%2d
for(size_t m=0;m<READING_PER_DAY;++m)
printf("%-5.1lf ",temperature[k][m]);//改为lf
printf("\n");
free(temperature[k]);
temperature[k]=NULL;
}
if(result)//修改
{
free(result);
result=NULL;
}
if(temperature)//修改
{
free(temperature);
temperature=NULL;
}
printf("\n%.1lf\n",average);//修改为%.1lf
return 0;
}
楼主不厚道啊,问题解决了,不采纳结贴了。