C 为什么替换某个角色的函数只对该角色的第一个实例执行此操作?
我有这个功能:C 为什么替换某个角色的函数只对该角色的第一个实例执行此操作?,c,function,C,Function,我有这个功能: char *replace_str(char *str, char *orig, char *rep) { static char buffer[4096]; char *p; if(!(p = strstr(str, orig))) return str; strncpy(buffer, str, p-str); buffer[p-str] = '\0'; sprintf(buffer+(p-str), "%s%s", rep, p+strlen(or
char *replace_str(char *str, char *orig, char *rep)
{
static char buffer[4096];
char *p;
if(!(p = strstr(str, orig)))
return str;
strncpy(buffer, str, p-str);
buffer[p-str] = '\0';
sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig));
return buffer;
}
当我使用它时,它只会更改要替换的角色的第一个实例。有什么方法可以让它对所说的所有字符执行此操作吗?如果我理解正确,您需要一个循环,在替换字符串结束后重新分配字符串的开头。实际上,您的函数只执行一次操作,因为strstrstr返回指向str中第一次出现的单词orig的指针 编辑:这可能会给你一个如何做的想法。我无法在这台计算机上测试它,因此它可能无法直接工作。 我是用malloc实现的,因为在我看来,静态字符不应该这样使用。它应该将值存储在缓冲区中,以便将来使用该函数。如果重新使用此函数,将丢失该函数以前的返回值。。。 这是我的做法,当然还有更有效的做法。此函数的优点是它可以适应任何字符串长度
char *replace_str(char *str, char *orig, char *rep)
{
char *buffer;
char *previous_version;
char *p;
size_t occurring_position;
if (strcmp(orig, rep) == 0)
{
return(str);
}
buffer = strdup(str);
while ((p = strstr(buffer, orig)))
{
occuring_position = p - buffer;
previous_version = strdup(buffer);
free(buffer);
buffer = malloc(strlen(previous_version) + strlen(rep) - strlen(orig));
strcnpy(buffer, previous_version, occurring_position);
strcpy(buffer, rep);
strcpy(buffer + occurring_position + strlen(rep), previous_version + occurring_position + strlen(orig));
free(previous_version);
}
return (buffer);
}
对重复更换,直到所有应该更换的都被更换。Lol。只是注意到我是多么多余。。谢谢;)请注意,此方法仅在
rep
长度不超过orig
时有效。谢谢您的回答。我不确定我是否正确实施了它。我把时间放在哪里?我想这完全是在删除我的字符串。@Damien什么是“缓冲区”?4096来自哪里?啊-现在我在原始代码中看到了,但在你的答案中没有看到。