如何使用realloc()在动态目标中插入字符串?

我在内存分配方面苦苦挣扎.我想把一个字符串输入到另一个字符串中,我制作了两个停止在同一个地方工作的函数 – realloc.这些功能非常相似.在第一个我通过char复制char到一个临时字符串,当我尝试将临时字符串复制到第一个时,我得到错误的地方.在第二个函数中,我将第一个字符串的结尾(从给定位置)复制到临时字符串,重新分配第一个字符串(这是我得到错误的地方)并从给定位置删除i中的所有内容.然后我将第二个字符串和临时字符附加到第一个字符串.这是我的代码.

第一个功能:

// str2 - is a string that I want to input in first string(str)
// at certain position (pos)

void ins (char **str, char *str2, int pos)
{
        // lenght of first and second strings
        int len = strlen(str[0]),
            len2 = strlen(str2),
            i, j, l = 0;

        // creating temporary string
        char *s = (char *) malloc ((len + len2) * sizeof(char));
        // copying first part of first string
        for (i = 0; i < pos; i++)
                s[i] = str[0][i];
        // copying second string
        for (j = 0; j < len2; j++)
                s[i + j] = str2[j]; 
        // copying second part of first string
        for (int k = pos; k < len; k++)
        {
                s[i + j + l] = str[0][k];
                l++;
        }

        // reallocating additional space for second string
        // and copying temporary string to first string
        str[0] = (char *) realloc (str[0], (len + len2) * sizeof(char));
        strcpy(str[0], s);

        free(s);
        s = NULL;
}

第二功能:

void ins2 (char **str,char *str2, int pos)
{
        // lenght of first and second string
        int len = strlen(str[0]),
            len2 = strlen(str2);

        // creating a temporary string and copying
        // from the given position
        char *s = (char *) malloc ((len - pos) * sizeof(char));
        strcpy(s, str[0] + pos);

        // reallocating space for string that will be added
        // deleting part of it from the given position
        str[0] = (char *) realloc(str[0], (len + len2) * sizeof(char));
        str[0][pos] = '\0';

        // adding second string and temporary string
        strcat(str[0], str2);
        strcat(str[0], s);

        // be free, temporary string
        free(s);
        s = NULL;
}

最佳答案 如果你正在做我认为你正在做的事情,你需要一个realloc(),假设传入的字符串确实已经动态分配(最好是):

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

void ins (char **str, const char *str2, size_t pos)
{
    // lenght of first and second strings
    size_t len = strlen(*str);
    size_t len2 = strlen(str2);

    // reallocate new string
    char *tmp = realloc(*str, len + len2 + 1);
    if (tmp != NULL)
    {
        *str = tmp;
        memmove(tmp+pos+len2, tmp+pos, len-pos);
        memcpy(tmp+pos, str2, len2);
        tmp[len+len2] = 0;
    }
}

int main()
{
    char *str = strdup("A simple string");
    char s2[] = "inserted ";

    printf("%s\n", str);
    ins(&str, s2, 9);
    printf("%s\n", str);

    free(str);
    return 0;
}

产量

A simple string
A simple inserted string

这个怎么运作

>传入的字符串都通过strlen()发送以获取它们的长度.一旦我们得到了那些,我们就知道产生的缓冲区需要多大.
>一旦我们r​​ealloc()缓冲区,原始内容被保留,但我们需要(可能)移动第一个字符串的内容为第二个字符串打开一个洞.如果完成该移位,则可能需要移动重叠的存储器(如在样本中那样).对于这种存储器复制,使用memmove().与memcpy()不同,memmove()库函数支持复制源和目标区域可能重叠的位置.
>一旦打洞,我们将第二个字符串memcpy()放到位.因为我们已经知道了长度,所以不需要strcpy().
>我们通过将最后一个槽添加到终止0来完成,从而完成以null结尾的字符串并完成操作

注意我没有做任何关于这个因为有人传递一个无效的pos(超出范围),NULL字符串,如果str2为空(或NULL)优化为空,等等.我留给你的那个清理,但我希望这个想法如何做到这一点很清楚.

点赞