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



我需要在不询问长度的情况下获得一个字符串,我创建了一个100个字符的缓冲区,当缓冲区满了时,我会进行realloc,在字符串的末尾添加一个字符的空间

这是我的密码。。。你能帮我吗?

#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]='';
    while ((c = getchar()) != EOF)
    {
        if (strlen(content) < 10){
            strcat(content, &c);
            content[strlen(content)+1] = '';
        }
       else {
            content=realloc(content,sizeof(char)*(strlen(content))+2);
            strcat(content, &c);
            content[strlen(content)+1] = '';
        }
    }
    printf("%s",content);       
    return 0;
}

这里有几个问题:

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

你应该按照@cnicutar的建议:

content[index] = c;

此外,您的代码中还有另一个问题。当您将"c"连接到"content"时,您正在覆盖"内容"末尾的"\0"。请记住,strlen将查找"\0"。

另一个问题是:

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

当strlen为9时,您将把"\0"放在content[10]中。您已经分配了大小为10的"内容",因此这意味着它从content[0]变为content[9]。

一个简单的

content[strlen(content)] = '';

应该做你想做的事。

相关内容

  • 没有找到相关文章