【问题标题】:Copy/concatenate dynamically allocated C style strings复制/连接动态分配的 C 风格字符串
【发布时间】:2015-09-29 03:08:56
【问题描述】:

我正在尝试编写一个函数来连接两个动态分配的 C 样式字符串。我的设计是否正确,您首先必须将目标复制到临时 char[],删除原始内存分配,获取两个 char[] 的长度,使用该新长度分配新内存,然后将字符复制到dest[]?

所以伪代码:

void concat(char* dest, char *source)
{
    char temp = dest;

    delete [] dest;

    char dest = new char [new size];

    copy temp to dest;

    copy source to dest;
}

我是否从根本上误解了这一点?

【问题讨论】:

    标签: c++ string dynamic concat


    【解决方案1】:

    不要删除dest,因为它可能指向非动态内存。然后使用strcat 或者更安全的strncat

    【讨论】:

    • 我必须编写自己的 concat 函数,尽管它会传递两个动态分配的 cstyle 字符串。
    • 在这种情况下,我将不理会dest 并分配一个全新的数组并返回一个指向该数组的指针。存在内存泄漏的可能性,但在这种情况下,这可能不是问题。大小很容易计算,strlen(dest) + strlen(source) + 1。然后你会想要附加字符串而不是复制它们。但总的来说,您的想法是正确的。
    • 正确使用strncat() 非常困难。快速:长度参数包含什么?如果您不能直接回答,则使用它是不安全的。 (提示:不是sizeof(dest)!)
    【解决方案2】:

    如果源和目标重叠,则必须复制到临时缓冲区,但如果不重叠,则不需要。使用 C char*,可能会发生这种情况,您可能会得到 mycat(str+2, str) 作为测试用例。

    【讨论】:

      【解决方案3】:

      你的 concat() 原型是:

      void concat(char* dest, char *source);
      

      因此,concat() 函数中“dest”的新分配不会反映在调用者函数中。

      两种可能的解决方案:

      1. 调用函数应重新分配具有新长度的“dest”,然后传递给 concat()。在这种情况下,concat() 不会执行重新分配。

      2. 如果允许 concat() 进行重新分配,那么它的原型应该改为:

        a) void concat(char** dest, char *source); -> Jonathan Leffler 建议在这种情况下可以使用 strcat/strncat

        b) char* concat(char* dest, char *source); -> 在这种情况下需要返回新分配的“dest”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多