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

全部博文(55)

文章存档

2011年(32)

2010年(23)

分类: C/C++

2010-11-28 18:54:22

/*
 * 编写一个函数,从标准输入读取一个字符串,把字符串复制到动态分配的内存中,并返回
 * 该字符串的拷贝。这个函数不应该对输入的字符串的长度作任何限制
 */
/*
 * Read a string and return a copy of it in dynamiccally allocated memory.
 * There is no limit (other than the amount of dynamic memory availale) on the size of the string.
 */
/*
 * The strategy used in this solution is to keep a dynamically allocated bufferin the readsting
 * function. If this fills while reading a string, it is enlarged. The increment, DELTA, can be
 * turned to achieve a balance between minimizing wasted space and minimizing the number of real-
 * locations that occur. The assert macro is used to abort the problem if any memory allocation
 * fails. A new chunk of memory is allocated for the copy of the string that is returned to the
 * caller-this avoids the overhead of dynamically growing the array from scratch each time ia
 * string is read.
 */
 

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

#define    DELTA    256

char *readstring()
{
    static    char    *buffer = NULL;
    static    int        buffer_size = 0;
    int        ch;
    int        len;
    char    *bp;

    bp = buffer;
    len = 0;
/*-----------------------------------?----------------------------------------*/
    /* Get characters one at a time until a newline is read or EOF is reached */
    do{
        ch = get();
        if( ch == '\n' || ch == EOF )
            ch == '\0';

        /* if the buffer is full,make it bigger */
        if( len >= buffer_size )
        {
            buffer_size += DELTA;
            buffer = realloc( buffer, buffer_size );
            assert( buffer != NULL );
            bp = buffer + len;
        }

        *bp++ = ch;
        len += 1;
    } while( ch != '\0' );
/*------------------------------------?---------------------------------------*/
    /* make a copy of the string to ruturn */
    bp = malloc( len );
    assert( bp != 0 );
    strcpy( bp, buffer );
    return bp;
}


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