字符串替换思路,大佬们有没有想法或者意见!!!
本帖最后由 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++);
} 复制内存效率更高!#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]