## [C]非常郁闷的一个问题

• From: "Thomas X. Iverson" <txi@xxxxxxxxxxxxx>
• To: ghostunix@xxxxxxxxxxxxx
• Date: Thu, 29 May 2008 12:39:41 +0800

```在做一道指针的习题，要求输入任意多个浮点数进行平均数的计算，动态分配内存

/* Exercise 7.1 Calculating a floating-point average using pointers */
/*********************************************************************
* In this solution we allocate a some memory and when it is full    *
* allocate a new, larger amount of memory and copy the contents of  *
* the old memory to the new. We then free the old memory. This      *
* process repeats as often as necessary.                            *
*********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(void)
{
double *values = NULL;     /* Pointer to memory holding data values       */
double *temp = NULL;       /* Pointer to newly allocated memory           */
double sum = 0.0;          /* Sum of values                               */
int capacity = 0;          /* Maximum number of values that can be stored */
int increment = 5;         /* Capacity increment for dynamic allocation   */
int count = 0;             /* Number of values read                       */
int i = 0;                 /* Index to array                              */
char answer = 'n';

do
{
if(count == capacity)    /* Check if there is spare memory */
{
capacity += increment; /* Increase the capacity of memory by increment */
temp = (double*)malloc((capacity)*sizeof(double)); /* and allocate it  */
if(temp == NULL)       /* If memory was not allocated */
{                      /* Output a message  and end   */
printf("Memory allocation failed. Terminating program.");
exit(1);
}
if(values == NULL)     /* Are there any values?                  */
values = temp;       /* No - so just copy address of new memory */
else                   /* Yes - so copy data from old to new      */
{
for(i = 0 ; i<count ; i++)
*(temp+i) = *(values+i);
free(values);        /* Free the old memory */
values = temp;       /* Copy address of new */
}
temp = NULL;           /* Reset pointer       */
}

printf("Enter a value: ");
scanf("%lf", values+count++);

printf("Do you want to enter another(y or n)? ");
scanf(" %c", &answer);
}while(tolower(answer) == 'y');

/* Now sum the values */
for(i = 0 ; i<count ; i++)
sum += *(values+i);

/* Output the average */
printf("\n The average of the the values you entered is %.2lf.\n", sum/count);
free(values);     /* We are done - so free the memory */
}

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>

int main(void)
{
double *temp=NULL;
double *value=NULL;
double sum=0.0;
int i;
int count=0;
int capa=0;
int incre=5;
char answer='n';

do
{
if(count==capa)
{
capa+=incre;
temp=(double *)malloc((capa)*sizeof(double));
if(temp==NULL)
{
printf("Failed\n");
return 1;
}
if(value==NULL)
value=temp;
else
{
for(i=0;i<count;i++)
{
*(temp+i)=*(value+i);
}
free(value);
value=temp;
}
temp=NULL;
}
printf("Enter a value:");
scanf("%lf",value+count++);
printf("Enter another?:");
scanf(" %c",&answer);
}while(tolower(answer)=='y');

for(i=0;i<count;i++);
{
sum+=*(value+i);
}
printf("%.2lf",sum/count);
free(value);
}

1.我自己写的这个代码无法很好的处理scanf输入缓冲问题
2.我自己写的这个代码计算出的平均值总是0,我后来加了个printf查看sum和count的值，sum总是为0,count没有问题，不知道为什么

--
Keep It Simple Stupid
http://blog.ghostunix.org
ghosTM55

```