gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:38:33 26 4
gpt4 key购买 nike

我正在为内存分配而苦苦挣扎。我想将一个字符串输入另一个字符串,我做了两个在同一个地方停止工作的函数——realloc。这些功能非常相似。在第一个中,我将一个字符一个字符地复制到一个临时字符串中,当我尝试将临时字符串复制到第一个字符串时,我遇到了错误。在第二个函数中,我将第一个字符串的末尾(从给定位置)复制到一个临时字符串,重新分配第一个字符串(这是我出错的地方)并从给定位置删除 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() 发送以获得它们的长度。一旦我们有了这些,我们就知道生成的缓冲区需要多大。
  • 一旦我们realloc() 缓冲区,原始内容将被保留,但我们(可能)需要移动第一个字符串的内容以便为第二个字符串打开一个洞。这种转变,如果完成,可能需要移动重叠的内存(就像在示例中所做的那样)。对于这种内存复制,使用了 memmove()。与 memcpy() 不同,memmove() 库函数支持复制源区域和目标区域可能重叠的地方。
  • 打完洞后,我们将 memcpy() 第二个字符串放到位。不需要 strcpy(),因为我们已经知道长度。
  • 我们通过将最后一个槽添加到终止符 0 来结束,从而完成以 null 终止的字符串并完成操作

请注意,对于传递无效 pos(超出范围)、NULL 字符串、如果 str2 为空(或NULL)等。我留给你的清理工作,但我希望关于如何完成这项工作的想法很清楚。

关于c - 如何使用 realloc() 在动态目标中插入字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23345035/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com