【问题标题】:Allocating Memory for a whole line of input of variable length stored as a single string为存储为单个字符串的可变长度输入的整行分配内存
【发布时间】:2016-01-21 20:36:40
【问题描述】:

我正在学习 C,并且正在阅读逐行输入的最佳方法。

基本上我想创建包含一整行输入的字符串。下面的问题没有回答我应该如何处理字符串的内存分配。

How can I scan strings with spaces in them using scanf()?

我应该先检测需要多少空间?如何?每次需要更多空间时我是否应该重新分配?

请举例说明

输入来自文件或标准输入(两者都可以,但不能同时)

【问题讨论】:

  • 问题太笼统了。你需要做什么?输入来自哪里?
  • 好吧,如果长度会改变,那么你需要使用realloc
  • 我在问题中包含了输入的来源,因此请删除您的反对意见
  • 根据平台的不同,你可能有一个getline 函数来为你分配内存。
  • @Helsing 如果您使用的是 Linux,请查看 %ms

标签: c string input


【解决方案1】:

以下重复分配缓冲区存储,直到输入被读取(省略 malloc/realloc 检查):

char *myGetLine(FILE *in)
{
    char *buffer= NULL;
    int c, i, j;

    i= 0; j= 0;
    do
    {
        c= fgetc(in);
        if (i==j) {
            j += 1024;
            buffer= realloc(buffer, j);
        }
        if (c==EOF) break;
        buffer[i++]= c;
    } while (1);
    buffer[i]= '\0';
    return buffer;
}

【讨论】:

  • 为什么要使用单独的缓冲区buf 并进行所有复制?如果有空间,只需存储到buffer,或者重新分配然后存储似乎更有意义。
  • 更好,但我认为您在重新分配时未能存储传入的字符。
  • 尽管如此。 :) 返回缓冲区可能是有意义的,以使函数可用作可重用的构建块。
  • 另外:你不需要初始的 malloc。 buff = realloc(NULL, new_size); 按预期工作
  • @unwind - 修正了你的评论。有什么理由不投反对票吗?
猜你喜欢
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
相关资源
最近更新 更多