caoxiaolin 发表于 2018-8-16 11:55

字符串子串替换函数

分享一下我写的 “字符串子串替换的函数”:lol


/*
      2018年8月16日 11:49:44
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int replace_str(const char * src, const char * key_src, const char * key, char ** buf);
int replace_count(const char * src, const char * key_src, int * n);
int main()
{
      char * str = "a 123 b 156 LL a f a 1";
      char * buf;
      int ret = 0;

      puts("替换前");
      puts(str);
      ret = replace_str(str, "a", "8888", &buf);
      if (ret != 0)
      {
                printf("%d", ret);
                system("pause");
                return -1;
      }

      puts("替换后");
      puts(buf);

      /*释放内存*/
      if (buf != NULL)
      {
                free(buf);
                buf = NULL;
      }

      return 0;
}

int replace_str(const char * src, const char * key_src, const char * key, char ** buf)
{
      /*参数错误判断*/
      if (src == NULL || key == NULL || buf == NULL)
      {
                return -1;
      }

      int len_src;
      int len_dst;
      char * tem_src;
      char * tem_buf;
      int count = 0;
      int ret;

      len_src = strlen(src);
      tem_src = (char *)malloc(len_src * sizeof(char) + 1);
      if (tem_src == NULL)
      {
                return -2;
      }
      memset(tem_src, 0, sizeof(len_src * sizeof(char) + 1));
      strcpy(tem_src, src);

      ret = replace_count(tem_src, key_src, &count); /*判断替换项数*/
      if (ret != 0)
      {
                return ret;
      }

      /*分配足够的空间*/
      len_dst = (len_src - count * strlen(key_src) + count * strlen(key) + 1) * sizeof(char); /*要增加或减少的空间*/
      tem_buf = (char *)malloc(len_dst);
      if (tem_buf == NULL)
      {
                return -5;
      }
      memset(tem_buf, 0, len_dst);

      //"abcd1234adcnwdabcd qwd abcd";
      const char * p = src;
      const char * q;
      int len = 0; /*记录要连接的长度*/

      while (1)
      {
                q = strstr(p, key_src);
                if (q == NULL) /* 表示找不到数据后。把后面的数据放进去 */
                {
                        strcat(tem_buf, p);
                        break;
                }
                len = q - p; /* 不需要替换数据的长度 */
                strncat(tem_buf, p, len); /* 先把不需要替换的数据放进去 */
                strcat(tem_buf, key); /* 把要替换的数据放进去 */
                p = q + strlen(key_src); /* 跳过找到的key_src */
      }
      *buf = tem_buf;

      if (tem_src != NULL)
      {
                free(tem_src);
                tem_src = NULL;
      }

      return 0;
}

int replace_count(const char * src, const char * key_src, int * n)
{
      if (src == NULL || key_src == NULL || n == NULL)
      {
                return -3;
      }
      int i = 0;
      int len = strlen(key_src);
      const char * p = src;
      const char * q;

      while (1)
      {
                q = strstr(p, key_src);
                if (q == NULL)
                {
                        break;
                }
                else
                {
                        p = q + len;
                        ++i;
                }

      }
      if (i == 0)
      {
                *n = i;
                return -4; /* 没有找到 */
      }

      *n = i;

      return 0;
}

妆容为我而画 发表于 2018-8-16 11:56

沙发上躺着

hbdcp 发表于 2018-8-16 12:03

小白表示看不明白

caoxiaolin 发表于 2018-8-16 12:07

hbdcp 发表于 2018-8-16 12:03
小白表示看不明白

我也是小白:lol

liuwenxuan 发表于 2018-8-16 12:23


小白表示看不明白

cyhcuichao 发表于 2018-8-16 12:36

表示没看懂

liuhaitao52PJ 发表于 2018-8-16 12:48

字母我到是都认识啊,啥意思就不知道了,哈哈,小白一个,见到能写代码的就敬佩。。。{:301_978:}

dpj149 发表于 2018-8-29 22:07

谢谢分享,研究一下

wei1355188058 发表于 2018-12-5 14:01

学习下,继续发扬
页: [1]
查看完整版本: 字符串子串替换函数