DreamF 发表于 2020-7-7 17:53:01

编写一个函数,从标准输入读取一个字符串,把字符串复制到动态内存分配的内存中,...

编写一个函数,从标准输入读取一个字符串,把字符串复制到动态内存分配的内存中,并返回该字符串的拷贝,这个函数不应该对读入字符串的长度作任何限制!

答案:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#define DELTA 256

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

    do{
      ch = getchar();
      if(ch == '\n' && ch == EOF)
            ch = '\0';

      if(len > buffer_size){
            buffer_size += DELTA;
            buffer = realloc(buffer,buffer_size);
            assert(buffer != NULL);
            bp = buffer + len;
      }
      *bp++ = ch;
      len++;
    }while(ch != '\0');

    bp = malloc(len);
    assert(bp != NULL);
    strcpy(bp,buffer);
    return bp;
}

这个BP可以直接++吗?不会和别的地址冲突吗?不应该申请一定的内存空间才能++吗   求大佬帮忙谢谢

赚小钱 发表于 2020-7-7 19:02:40

肉眼感觉
L27: len++;

应该放到
L19

superbe 发表于 2020-7-7 19:29:45

本帖最后由 superbe 于 2020-7-7 19:42 编辑

第20行 if(len > buffer_size){   这行里应该改成 len >= buffer_size,不然运行出错。

realloc() 每次重新分配内存,起始地址不一定与原来相同,但是每次总长度增加 DELTA 这一块长度。在循环里 BP 是指向DELTA这一块的首地址,++不会和别的地址冲突。

页: [1]
查看完整版本: 编写一个函数,从标准输入读取一个字符串,把字符串复制到动态内存分配的内存中,...