我在内存分配方面苦苦挣扎.我想把一个字符串输入到另一个字符串中,我制作了两个停止在同一个地方工作的函数 – 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()发送以获取它们的长度.一旦我们得到了那些,我们就知道产生的缓冲区需要多大.
>一旦我们realloc()缓冲区,原始内容被保留,但我们需要(可能)移动第一个字符串的内容为第二个字符串打开一个洞.如果完成该移位,则可能需要移动重叠的存储器(如在样本中那样).对于这种存储器复制,使用memmove().与memcpy()不同,memmove()库函数支持复制源和目标区域可能重叠的位置.
>一旦打洞,我们将第二个字符串memcpy()放到位.因为我们已经知道了长度,所以不需要strcpy().
>我们通过将最后一个槽添加到终止0来完成,从而完成以null结尾的字符串并完成操作
注意我没有做任何关于这个因为有人传递一个无效的pos(超出范围),NULL字符串,如果str2为空(或NULL)优化为空,等等.我留给你的那个清理,但我希望这个想法如何做到这一点很清楚.