Chinaunix首页 | 论坛 | 博客
  • 博客访问: 387767
  • 博文数量: 55
  • 博客积分: 1907
  • 博客等级: 上尉
  • 技术积分: 869
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-04 19:30
文章分类

全部博文(55)

文章存档

2011年(32)

2010年(23)

分类: C/C++

2010-11-28 18:51:51

/*
 * 请编写一个函数,从标准输入读取一列整数,把这些值存储于一个动态分配的数组中
 * 并返回这个数组。函数通过观察 EOF 来判断输入列表是否结束。数组的第一个数是
 * 数组包含的值的个数,它的后面就是这些整数值。
 */
/*
 * 这个函数分配一个数组,并在需要时根据一个固定的增值对数组进行重新分配。
 * 增量DELTA可以进行微调,用于在效率和内存浪费之间做一平衡。
*/
 

#include <stdio.h>
#include <malloc.h>

#define DELTA    100

int *readints(void)
{
    int *array;
    int size;
    int count;
    int value;

    /* 获得最初的数组,大小足以容纳DELTA个值 */
    size = DELTA;
    array = malloc( ( size+1 ) * sizeof( int ) );    //传入的是字节数

    if( array == NULL )
        return NULL;    //空指针

/*----------------------------------------------------------------------*/
    //从标准输入获得值

    count = 0;
    while( scanf( "%d", &value ) == 1 )
    {
        /* 如果需要,使数组变大,然后存储这个值 */
        count += 1;
        if( count > size )
        {
            size += DELTA;
            array = realloc( array, ( size+1 ) * sizeof( int ) ); //扩大分配内存

            if( array == NULL )
                return NULL;
        }
    }

    array[count] = value;
/*-----------------------------------------------------------------------*/
    /*
     * 改变数组的长度,使其刚刚正好,然后存储计算值并返回这个数组。
     * 这样做绝不会使数组更大,所以它绝不应该失败(但还是应该进行检查!)。
     */

    if( count < size )
    {
        array = realloc( array, ( count+1 ) * sizeof(int) );
        if(array == NULL)
            return NULL;
    }
    array[0] = count;
    return array;
}


阅读(1148) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~