鱼C论坛

 找回密码
 立即注册
查看: 979|回复: 1

[技术交流] 字符串替换思路,大佬们有没有想法或者意见!!!

[复制链接]
发表于 2020-3-27 20:17:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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[Max];
        static char substr[Max]={"88"};
        static char flag[Max]={"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++);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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[Max];
        static char substr[Max]={"888"};
        static char flag[Max]={"<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);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 17:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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