马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 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[Max];
static char sub[Max];
static char res[Max];
if (argc != 4)
{
printf("%d",argc);
return 0;
}
strcpy(src, argv[1]);
strcpy(sub, argv[2]);
strcpy(res, argv[3]);
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
|