Cool_Breeze 发表于 2020-3-27 20:17:56

字符串替换思路,大佬们有没有想法或者意见!!!

本帖最后由 Cool_Breeze 于 2020-3-27 20:21 编辑

Dec-C++
.c
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>

FILE* filepointer(const char *file,const char *mode);
void insert_str(char* str,char* flag,size_t sl,size_t fn);
void replace_gtr_str(char* str,char* flag,size_t sl,size_t fl);
void replace_lss_str(char* str,char* flag,size_t subl,size_t fl);
void replace_equ_str(char* str,char* flag,size_t fl);

//字符串大小
#define Max 1024

int main(int argc,char **argv)
{
        FILE* fp=filepointer("test.txt","rb");
        FILE* fpo=filepointer("result.txt","wb");       
        static char str;
        static char substr={"88"};
        static char flag={"Cool_Breeze"};
        char *p=str;
        while (fgets(str,Max,fp))
        {
                p=str;
                for (;;)
                {
                        p=strstr(p,substr);
                        if (p == NULL) break;
                        if (strlen(substr) < strlen(flag)) replace_lss_str(p,flag,strlen(substr),strlen(flag));
                        else if (strlen(substr) > strlen(flag)) replace_gtr_str(p,flag,strlen(substr),strlen(flag));
                        else if (strlen(substr) == strlen(flag)) replace_equ_str(p,flag,strlen(flag));
                }
                fprintf(fpo,"%s\n",str);
        }
        fclose(fp);
        fclose(fpo);
    return 0;
}

FILE* filepointer(const char *file,const char *mode)
{
        FILE *fp;
        if (!(fp = fopen(file,mode)))
        {
                printf("open fail! [%s]:%s\n",file,strerror(errno));
                exit(EXIT_FAILURE);
        }
        return fp;
}
/*
        在字符串开始插入指定字符串
        str原字符串的起点
        flag 指定字符串
        sl   原字符串长度
        fl   指定字符串长度
*/
void insert_str(char* str,char* flag,size_t sl,size_t fl)
{
        char* pe=str+sl;//指向字符串‘\0’
        char* pme=pe+fl;//指向后移flag大小后的位置
        register size_t i=0;
        for (i=0;i<=sl;i++)
                *(pme--)=*(pe--);//将余下所有字符往右移动fl
        for (i=0;i<fl;i++)
                *(str++)=*(flag++);//将flag放入str后面
}
/*
        被替换字符串长度大于替换字符字符串长度
        explanation:
        str=abcd,flag=abc
       
        str原字符串的起点
        flag 替换的字符串
        sl   被替换字符长度
        fl   替换字符串长度
*/
void replace_gtr_str(char* str,char* flag,size_t sl,size_t fl)
{
        register size_t i=0;
        for (i=0;i<fl;i++)
                *(str+i)=*(flag+i);//直接将flag放入str后面
        char* pe=str+fl;//指向字符串‘\0’的位置
        char* pme=pe+(sl-fl);
        for (i=0;i<strlen(str+sl);i++)//strlen(str+sl)=剩余字符串长度
                *(pe++)=*(pme++);//将余下所有字符往左移动sl-fl
        *pe='\0';//左移完成后添加结束符
}
/*
        被替换字符长度小于替换字符串长度
        删除被替换字符串
        explanation:
        str=abc,flag=abcd
       
        str原字符串的起点
        flag 替换的字符串
        subl 被替换字符长度
        fl   替换字符串长度
*/
void replace_lss_str(char* str,char* flag,size_t subl,size_t fl)
{
        char* pe=str;
        char* pme=pe+subl;
        register size_t i=0;
        for (i=0;i<strlen(str);i++)
                *(pe++)=*(pme++);
        *pe='\0';
        //调用插入字符串
        insert_str(str,flag,strlen(str),fl);
}
/*
        被替换字符串与指定字符串相等
        explanation:
        str=abc,flag=abc
       
        str原字符串的起点
        flag 替换的字符串
        fl   替换字符长度
       
*/
void replace_equ_str(char* str,char* flag,size_t fl)
{
        register size_t i=0;
        for (i=0;i<fl;i++)
                *(str++)=*(flag++);
}

Cool_Breeze 发表于 2020-3-31 15:00:40

复制内存效率更高!#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>

FILE* filepointer(const char *file,const char *mode);
void insert_str(char* str,char* flag,size_t sl,size_t fn);
void replace_gtr_str(char* str,char* flag,size_t sl,size_t fl);
void replace_lss_str(char* str,char* flag,size_t subl,size_t fl);
void replace_equ_str(char* str,char* flag,size_t fl);

//字符串大小
#define Max 1024

int main(int argc,char **argv)
{
        FILE* fp=filepointer("test.txt","rb");
        FILE* fpo=filepointer("result.txt","wb");       
        static char str;
        static char substr={"888"};
        static char flag={"<A>"};
        char *p=str;
        while (fgets(str,Max,fp))
        {
                p=str;
                for (;;)
                {
                        p=strstr(p,substr);
                        if (p == NULL) break;
                        if (strlen(substr) < strlen(flag)) replace_lss_str(p,flag,strlen(substr),strlen(flag));
                        else if (strlen(substr) > strlen(flag)) replace_gtr_str(p,flag,strlen(substr),strlen(flag));
                        else if (strlen(substr) == strlen(flag)) replace_equ_str(p,flag,strlen(flag));
                }
                fprintf(fpo,"%s",str);
        }
        fclose(fp);
        fclose(fpo);
    return 0;
}

FILE* filepointer(const char *file,const char *mode)
{
        FILE *fp;
        if (!(fp = fopen(file,mode)))
        {
                printf("open fail! [%s]:%s\n",file,strerror(errno));
                exit(EXIT_FAILURE);
        }
        return fp;
}
/*
        在字符串开始插入指定字符串
        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 replace_gtr_str(char* str,char* flag,size_t sl,size_t fl)
{
        memmove(str+fl,str+sl,sl+1);
        memmove(str,flag,fl);
}
/*
        被替换字符长度小于替换字符串长度
        删除被替换字符串
        explanation:
        str=abc,flag=abcd
       
        str原字符串的起点
        flag 替换的字符串
        subl 被替换字符长度
        fl   替换字符串长度
*/
void replace_lss_str(char* str,char* flag,size_t subl,size_t fl)
{
        register size_t temp=strlen(str)-subl;//剩余字符串长度
        memmove(str+fl,str+subl,temp+1);
        memmove(str,flag,fl);
}
/*
        被替换字符串与指定字符串相等
        explanation:
        str=abc,flag=abc
       
        str原字符串的起点
        flag 替换的字符串
        fl   替换字符长度
       
*/
void replace_equ_str(char* str,char* flag,size_t fl)
{
        memmove(str,flag,fl);
}
页: [1]
查看完整版本: 字符串替换思路,大佬们有没有想法或者意见!!!