吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3240|回复: 7
收起左侧

[C&C++ 转载] 字符串子串替换函数

[复制链接]
caoxiaolin 发表于 2018-8-16 11:55
分享一下我写的 “字符串子串替换的函数”


[C] 纯文本查看 复制代码
/*
        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
liuwenxuan 发表于 2018-8-16 12:23

小白表示看不明白
cyhcuichao 发表于 2018-8-16 12:36
表示没看懂
liuhaitao52PJ 发表于 2018-8-16 12:48
字母我到是都认识啊,啥意思就不知道了,哈哈,小白一个,见到能写代码的就敬佩。。。
dpj149 发表于 2018-8-29 22:07
谢谢分享,研究一下
wei1355188058 发表于 2018-12-5 14:01
学习下,继续发扬
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 22:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表