c - 如何替换c中的子字符串?

标签 c

这个例子有效,但我认为内存泄漏。简单 Web 服务器模块中使用的函数,因此如果使用此函数,共享内存会增长。

    char *str_replace ( const char *string, const char *substr, const char *replacement ){
      char *tok = NULL;
      char *newstr = NULL;
      char *oldstr = NULL;
      if ( substr == NULL || replacement == NULL ) return strdup (string);
      newstr = strdup (string);
      while ( (tok = strstr ( newstr, substr ))){
        oldstr = newstr;
        newstr = malloc ( strlen ( oldstr ) - strlen ( substr ) + strlen ( replacement ) + 1 );
        memset(newstr,0,strlen ( oldstr ) - strlen ( substr ) + strlen ( replacement ) + 1);
        if ( newstr == NULL ){
          free (oldstr);
          return NULL;
        }
        memcpy ( newstr, oldstr, tok - oldstr );
        memcpy ( newstr + (tok - oldstr), replacement, strlen ( replacement ) );
        memcpy ( newstr + (tok - oldstr) + strlen( replacement ), tok + strlen ( substr ), strlen ( oldstr ) - strlen ( substr ) - ( tok - oldstr ) );
        memset ( newstr + strlen ( oldstr ) - strlen ( substr ) + strlen ( replacement ) , 0, 1 );
        free (oldstr);
      }
      return newstr;
    }

最佳答案

我可以看到的一个问题是,如果替换字符串包含搜索字符串,您将永远循环(直到内存不足)。

例如:

char *result = str_replace("abc", "a", "aa");

此外,每次替换一个实例时执行另一个 malloc/free 非常昂贵。

更好的方法是对输入字符串进行 2 次传递:
  • 第一遍,计算存在多少个搜索字符串的实例
  • 既然您知道有多少匹配项,请计算一次结果和 malloc 的长度:

    strlen(string) + 匹配*(strlen(replacement)-strlen(substr)) + 1
  • 再次遍历源字符串,复制/替换
  • 关于c - 如何替换c中的子字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3659694/

    相关文章:

    c - 在 C 中遇到数组指针问题

    c - GDB 影响 setcontext 结果

    c - 当 stdout 被重定向到该文件时,为什么 printf() 不输出到该文件?

    c - 如何在 C 中读取二维数组?

    c - Emacs 执行两次 `c-mode-hook`

    c - Unix编程。不确定如何使用 passwd 结构

    c - C 中动态分配的字符串数组

    c - 如何在 Mac 网络内核扩展(套接字过滤器)中识别 C 中的进程?

    c - 如何获取按长度排序的 C 代码函数列表?

    c - 基数排序的实现