【发布时间】:2022-01-08 07:16:21
【问题描述】:
我遇到了这个问题,它询问是否可以编写函数
void insert(char* M, char* T, int i)
从索引 i 开始在 M 中插入字符串 T,而不使用中间字符串...我尝试使用 realloc 但我认为当原始字符串 M 比结果小很多时会出现问题,我的理论是realloc 更改了字符串的地址以能够表示新字符串。
例如:M="Wg" T="ron" and i=1;结果应该是 M="Wrong"。
我正在使用以下代码:
void insert(char* M,char* T,int i)
{
int l;
l=strlen(M);
M=realloc(M,l+strlen(T)+1);
for(int j = l-1; j >= i; j--)
{
M[j+strlen(T)]=M[j];
}
for(int j = 0;j < strlen(T); j++)
{
M[i+j]=T[j];
}
M[l+strlen(T)]='\0'; //from what i've tested the string M is correct.
}
并使用此声明:
char *s=malloc(3);
char *c=malloc(18);
strcpy(s,"as");
strcpy(c,"bcdefghijklmnopqr");
insert(s,c,1); //this example does not work on my machine.
我希望这可以澄清问题。
那么有什么办法吗?
【问题讨论】:
-
man memmove... -
如果您要使用
realloca) 传递的指针必须是动态分配的(例如,不是数组),并且 2) 您必须return重新分配的指针调用者。 -
从编辑中,您将无法从
M = "Wg"重新分配或插入任何内容。 -
@RafikBouloudene 如果内存管理的责任在调用者身上,那么
insert原型是可能的。请说明您遇到问题的部分。 -
用另一种方式问,您是否在为组合字符串或实际组合字符串的算法分配足够空间时遇到问题?这是两个不同的问题。