在另一个-C的中间添加新的字符串

在另一个-C的中间添加新的字符串,c,string,append,C,String,Append,我的任务是编写一个字符串,然后编写该字符串中需要替换为另一个字符串的部分。我设法让它工作,但如果替换的字符串比需要替换的字符串长,它只会“吃掉”一些字母。我能在这项任务上得到一些帮助吗? 工作代码示例: 输入: This is a beautiful day. END 输入2: a be 输入3: not a bee 预期产出: This is not a beeautiful day. 我的输出: This is not a beeful day. 代码: #包括 #包括 #包括 #

我的任务是编写一个字符串,然后编写该字符串中需要替换为另一个字符串的部分。我设法让它工作,但如果替换的字符串比需要替换的字符串长,它只会“吃掉”一些字母。我能在这项任务上得到一些帮助吗? 工作代码示例:

输入:

This is a beautiful day.
END
输入2:

a be
输入3:

not a bee
预期产出:

This is not a beeautiful day.
我的输出:

This is not a beeful day.
代码:

#包括
#包括
#包括
#包括
#定义最大1000
main(){
char unos[MAX+1];
int i=0;
字符c;
printf(“输入text.For end type end\n”);
而(1){
scanf(“%[^\n]%*c”,unos,&c);
i=strstr(unos,“结束”)-unos;
如果(i>=0){
unos[i]='\0';
打破
}
}
char trazena_zamjena[MAX+1]=“0”;
char zamjena[MAX+1];
printf(“输入需要更换的零件:”;
i=0;
做{
scanf(“%c”和特拉泽纳•扎姆耶纳[i]);
如果(trazena_zamjena[i]='\n'){
trazena_zamjena[i]='\0';
打破
}
i++;
}while(trazena_zamjena[i]!='\n');
printf(“输入替换文本:”);
i=0;
做{
scanf(“%c”&zamjena[i]);
如果(zamjena[i]='\n'){
zamjena[i]='\0';
打破
}
i++;
}while(zamjena[i]!='\n');
int l=i;
char*ptr;
ptr=strstr(联合国办事处,特拉泽纳·扎姆耶纳);
printf(“指针:%d%p”,ptr,ptr);
strncpy(左扎姆耶纳ptr);
printf(“%s\n”,unos);
}

让我们忘记结尾。 在C中使用字符串时,将以
'\0'
结尾的字符序列放入内存中

假设您有以下字符串
char*str=“string”具有地址
str
。 利用

ptr = strstr(str, "i");
ptr
值将是
str+3
(字符的地址
'i'
) 因此,假设您试图用
“ae”
替换
“i”

将在
ptr
指向的地址写入
'a'
'i'
)和
'e'
ptr+1
指向的地址写入
'n'
) 如果替换的子字符串太小,则应移动以下所有字符

您可以通过以下方式修改代码的结尾:

printf("pointer : %d %p", ptr, ptr);
int len_substr = strlen(trazena_zamjena);
if (l > len_substr)
  strncpy(ptr + l,  ptr + len_substr, strlen(ptr + len_substr));
strncpy(ptr, zamjena, l);

如果添加的字符串小于要删除的子字符串,则会出现类似问题。

如果要读取整行,请不要使用
scanf
使用卷积格式字符串,而是使用
scanf(“%[^\n]]*c”,unos,&c)似乎不对me@JoachimPileborg输入的代码工作正常,进行更改的代码工作不正常。我们还没有在课堂上使用fgets,所以我们不能使用它。@AntonioGvardijan所以你不允许使用
fgets
(?!)。你正在用
strncpy
覆盖字符串,所以你的程序行为是正确的。如果您想插入字符,那么您必须通过进一步移动字符串的结尾来插入字符。拿一张纸在替换前后画出你的
unos
缓冲区的内容。这是一个注释而不是答案。
strncpy(ptr, "ae", 2);
printf("pointer : %d %p", ptr, ptr);
int len_substr = strlen(trazena_zamjena);
if (l > len_substr)
  strncpy(ptr + l,  ptr + len_substr, strlen(ptr + len_substr));
strncpy(ptr, zamjena, l);