Cool_Breeze 发表于 2020-7-29 17:21:29

C语言字符串查找并替换

本帖最后由 Cool_Breeze 于 2020-7-29 17:22 编辑

# BUG 每次都是在原地址中查找
# 所以替换字符串不能包含被替换字符串(替=’abc‘, 被=‘bc’)
# 导致无限循环
# 方法:
# 先查找,折叠找到的字符串
# 在折叠处插入字符串
#if 0
        By Cool_Breeze
        Dev-C++ 5.11
        .c
        #endif
#include <stdio.h>
#include <string.h>

void insert_str(char* str,char* flag,size_t sl,size_t fn);
void fold(char* str,size_t rl,char* flag,size_t sl,size_t fl);

//字符串大小
#define Max 1024

int main(int argc,char **argv)
{
        static char src;
        static char sub;
        static char res;
       
        if (argc != 4)
        {
                printf("%d",argc);
                return 0;
        }
        strcpy(src, argv);
        strcpy(sub, argv);
        strcpy(res, argv);
       
        register size_t srclen=strlen(src);
        register size_t sublen=strlen(sub);
        register size_t reslen=strlen(res);
       
        if (!srclen || !sublen || !reslen)
        {
                printf("%s", src);
                return 0;
        }
        char *p = src;
        while (*p)
        {
                if ((p=strstr(p,sub)) == NULL) break;
                else fold(p,srclen,res,sublen,reslen);
        }

        printf("%s",src);

    return 0;
}

/*
        在字符串开始插入指定字符串
        str原字符串的起点
        flag 指定字符串
        sl   原字符串长度
        fl   指定字符串长度
*/
void insert_str(char* str,char* flag,size_t sl,size_t fl)
{
        memmove(str+fl,str,sl+1);//+1存放结束符'\0'
        memmove(str,flag,fl);
}
/*
        被替换字符串长度大于替换字符字符串长度
        explanation:
        str=abcd,flag=abc
       
        str原字符串的起点
        flag 替换的字符串
        sl   被替换字符长度
        fl   替换字符串长度
*/
void fold(char* str,size_t rl,char* flag,size_t sl,size_t fl)
{
        memmove(str,str+sl,rl-sl+1);
        insert_str(str,flag,rl,fl);
}bat:
@echo off
set "s=三四ABCDE三四FG一二三四"
字符串查找及替换.exe "%s%" "三四" "Fishc"
pause >nul

FishcABCDEFishcFG一二Fishc
页: [1]
查看完整版本: C语言字符串查找并替换