鱼C论坛

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

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

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

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

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

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

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

  4. #define DELTA 256

  5. char *readstring()
  6. {
  7.     static char *buffer = NULL;
  8.     static int buffer_size = 0;
  9.     int ch;
  10.     int len = 0;
  11.     char *bp = buffer;

  12.     do{
  13.         ch = getchar();
  14.         if(ch == '\n' && ch == EOF)
  15.             ch = '\0';

  16.         if(len > buffer_size){
  17.             buffer_size += DELTA;
  18.             buffer = realloc(buffer,buffer_size);
  19.             assert(buffer != NULL);
  20.             bp = buffer + len;
  21.         }
  22.         *bp++ = ch;
  23.         len++;
  24.     }while(ch != '\0');

  25.     bp = malloc(len);
  26.     assert(bp != NULL);
  27.     strcpy(bp,buffer);
  28.     return bp;
  29. }
复制代码


这个BP可以直接++吗?不会和别的地址冲突吗?不应该申请一定的内存空间才能++吗   求大佬帮忙  谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-7 19:02:40 | 显示全部楼层
肉眼感觉
  1. L27: len++;
复制代码

应该放到
  1. L19
复制代码
小甲鱼最新课程 -> https://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这一块的首地址,++不会和别的地址冲突。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-13 19:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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