C在不知道字符数的情况下分配字符串

时间:2012-01-19 13:11:56

标签: c string malloc

我需要一个字符串而不需要长度, 我创建了一个100字符的缓冲区,当它已满时我会重新分配一个字符串末尾的字符空间

这是我的代码......你能帮助我吗?

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

int main(int argc, char **argv)
{   
    char *content = malloc(10*sizeof(char));
    char c;
    content[0]='\0';

    while ((c = getchar()) != EOF)
    {
        if (strlen(content) < 10){
            strcat(content, &c);
            content[strlen(content)+1] = '\0';
        }
       else {
            content=realloc(content,sizeof(char)*(strlen(content))+2);
            strcat(content, &c);
            content[strlen(content)+1] = '\0';
        }
    }
    printf("%s",content);       

    return 0;
}

2 个答案:

答案 0 :(得分:2)

这里有几个问题:

  1. 那样使用strcat!您应该将指针传递给\0终止的字符串,而不是指向单个字符的指针。这只是偶然的。
  2. 在单独的变量中跟踪分配的内存大小,而不是使用strlen()
  3. 使用另一个单独的变量跟踪字符串中的位置,而不是经常调用strlen()。循环完成后,设置终止\0一次。
  4. 更好的重新分配策略是增加块中的内存分配,即不是每个字节。每次分配的内存耗尽时,您可以分配X个字节,或者可以将分配的字节数加倍。

答案 1 :(得分:0)

你应该做@cnicutar建议的事情:

content[index] = c;

此外,您的代码还有另一个问题。当您将“c”连接到“content”时,您将覆盖“content”末尾的“\ 0”。请记住,strlen会查找'\ 0'。

另一个问题是:

content[strlen(content)+1] = '\0';

当您的strlen为9时,您将在内容[10]上放置'\ 0'。您已经分配了大小为10的“内容”,因此它意味着它从内容[0]转到内容[9]。

一个简单的

content[strlen(content)] = '\0';

应该做你想做的事。