鱼C论坛

 找回密码
 立即注册
查看: 1730|回复: 2

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

[复制链接]
发表于 2020-7-7 17:53:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

答案:
#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可以直接++吗?不会和别的地址冲突吗?不应该申请一定的内存空间才能++吗   求大佬帮忙  谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-7 19:02:40 | 显示全部楼层
肉眼感觉
L27: len++;
应该放到
L19
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-7 19:29:45 | 显示全部楼层
本帖最后由 superbe 于 2020-7-7 19:42 编辑

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

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 13:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表