繁体   English   中英

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

[英]C allocate a string without knowing the numbers of characters

我需要获取一个字符串而不需要长度,我创建一个100字符的缓冲区,当它已满时我做一个realloc为字符串末尾的char添加一个空格

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

#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;
}

这里有几个问题:

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

你应该做@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';

应该做你想做的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM