【问题标题】:Appending a string to another in C在C中将一个字符串附加到另一个字符串
【发布时间】:2013-12-21 22:34:23
【问题描述】:

这个实现对您有任何意义吗?我正在尝试编写一个将连接两个字符串并可以称为appendstr(&dest, "xyz"); 的函数 我完全不确定我在这里所做的是否是一个好习惯,重新分配newptr 的空间超过origptr,然后释放它并使其等于newptr

void *appendstr(char **origptr, const char *strdata)
{
    size_t len1 = strlen(*origptr);
    size_t len2 = strlen(strdata);
    char *newptr = realloc(*origptr, len1 + len2 + 1);
    if (newptr != NULL)
    {
        memcpy(newptr + len1, strdata, len2 + 1);
        free(*origptr);
        *origptr = newptr;
    }
    return newptr;
}

我要做的就是不要更改*origptr 中的任何内容,直到我确定内存分配没有问题,然后才进行连接。 另外,另一个问题是我是否准确地分配了我需要的内存量。

【问题讨论】:

  • 不需要释放(*origptr)。如果 newptr 与 origptr 不同,realloc() 会这样做。
  • 你有理由不只使用 strcat(...) 吗? [查看这篇文章。][1] [1]:stackoverflow.com/questions/308695/c-string-concatenation
  • 如果realloc()无法分配新空间,则返回NULL,原指针仍然有效,但没有多余空间。
  • @NonlinearIdeas:是的,有充分的理由不使用strcat(),特别是它必须重新扫描重新分配空间的第一个len1字节才能找到代码已经知道的空值在newptr + len1。使用 memcpy() 可以保存重新扫描。
  • 提示:如果您打算多次连接,最好总是四舍五入到 2 的下一次幂,以接近最终大小 O(log N)。

标签: c string-concatenation


【解决方案1】:

这应该足够了。这只是你的代码,没有free()

void *appendstr(char **origptr, const char *strdata)
{
    size_t len1 = strlen(*origptr);
    size_t len2 = strlen(strdata);
    char *newptr = realloc(*origptr, len1 + len2 + 1);
    if (newptr != NULL)
    {
        memcpy(newptr + len1, strdata, len2 + 1);
        *origptr = newptr;
    }
    return newptr;
}

如果无法连接字符串,则返回NULL,并且*origptr 不会更改。否则,它返回(可能是新的)分配的指针和数据连接。 *origptr 则将与返回值具有相同的值。

memcpy() 而不是strcat() 因为strcat() 需要通过内部调用strlen()(或执行自己的strlen() 版本)来知道字符串的结束位置。无论如何,您调用strlen() 因为您需要字符串的长度来计算要分配的内存量,您可以使用memcpy() 在第一个字符串之后直接复制第二个字符串,跳过对@987654334 的隐式第二次调用@如果使用strcat()

【讨论】:

  • 感谢您的回答!我应该使用 memmove 而不是 memcpy 吗?
  • 关于memcpy() vs memmove(),请阅读:stackoverflow.com/questions/4415910/memcpy-vs-memmove
  • 有什么方法可以让我在这个实现中出现内存溢出,也许是通过获取第二个非空终止的参数?如果可能的话,我该如何解决这个问题?
  • 我认为这将是另一个问题的主题;)当然,如果第二个字符串不是以空值结尾的,您会遇到严重的问题。首先,strlen() 调用可能会出现段错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 2017-06-06
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多