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来自哪里?啊-现在我在原始代码中看到了,但在你的答案中没有看到。