/*
在一个字符串A中,查找其子字符串B的位置及个数 。
并用另一个字符串C替换在字符串A中的B 。
注意:1。要考虑内存与效率的问题 。
2。注意c字符串和b字符串的长度问题,二者长度不一定相等 。
3。注意在替换时规则的定义:aaaaa,aa替换为a 结果为 aaa?a?
*/
#include <stdio.h>
#include <string.h>
void input(char *p);
int select(char *p1,char *p2,int *n);//反回1表示找到串,0为未找到;n为记录第几个位置开始的,位置从0开始算起
void del(char *p1,int n,int m);
void change_2(char *p1,char *p3,int n);
int change(char *p1,char *p2,char *p3);
void print(char *p);
void main()
{
char str_b[80];//原串
char str_s[20];//查找串
char str_c[20];//改变后串
char *p_b;//指向原串
char *p_s;//指向查找串
char *p_c;//指向改变串
int i;
int *j;
int a;
int b;
j=&a;
p_b=str_b;
p_s=str_s;
p_c=str_c;
puts("请输入原串:");
input(p_b);
puts("请输入要查找的串:");
input(p_s);
puts("请输入用来替换的串:");
input(p_c);
b=select(p_c,p_s,j);
if(b!=0)
{
printf("无意义处理!\n");
return;
}
i=change(p_b,p_s,p_c);
if(i!=0)
{
puts("替换后的串为:");
print(p_b);
putchar(10);
}
else
puts("不存在要替换的串!");
return ;
}
void input(char *p)//输入串函数
{
gets(p);
return;
}
int select(char *p1,char *p2,int *n)//从p1里查找p2
{
int flag=0;//标志是否存在
int loca;//标志存在位序
int len=0;//记录主串走的位置的
int len1,len2;//分别记录二个串的长度
char *t1,*t2;
int len_2;//标志2走了的位置
t1=p1;
t2=p2;
len1=strlen(t1);
len2=strlen(t2);
if(len2>len1)//当查找的串比原串长
{
/*printf("\"");
print(p1);
printf("\"");
printf("不包含:");
printf("\"");
print(p2);
printf("\"");
putchar(10);*/
return 0;
}
else
{
while(strlen(t1)>=strlen(t2))
{
if(*t1!=*t2)
{
t1++;
len++;
}
else
{
len_2=0;
while(*t1==*t2&&*t2)
{
t1++;
t2++;
len_2++;
}
if(len2==len_2)
{
flag=1;//能查找到
loca=len;//记录起始位置
break;
}
else
{
len++;
t1=p1+len;
t2=p2;
}
}
}
if(flag==1)//查找到串
{
/*printf("\"");
print(p1);
printf("\"");
printf("中包含\"");
print(p2);
printf("\"");
putchar(10);
printf("位置是%d个开始!\n",len+1);*/
*n=len;
return 1;
}
}
return 0;
}
int change(char *p1,char *p2,char *p3)//将p1里存在的p2用p3替换
{
int flag;
int len2;//第二个串的长度
int wei;//存在字符的起始位置
//int i,j;
int *w;
int count=0;
char *t1,*t2,*t3;
w=&wei;
t1=p1;
t2=p2;
t3=p3;
len2=strlen(p2);
flag=select(p1,p2,w);//用wei得到字符的起始位置及判断是否存在可替换的字符
while(flag)
{
count++;
del(p1,wei,len2);
change_2(p1,p3,wei);
flag=select(p1,p2,w);//用wei得到字符的起始位置及判断是否存在可替换的字符
}
return count;
}
void del(char *p1,int n,int m)//将p1里从第n个开始的m个删除掉
{
char *tf,*ted;
tf=p1+n;
ted=p1+n+m;
while(*ted)
{
*tf=*ted;
tf++;
ted++;
}
*tf='\0';
}
void change_2(char *p1,char *p3,int n)//从第n位用p3插入
{
char *t1,*t3;
char *ted;//指向p1尾部指针
char *tnw;//指向新尾部
int len3;//p3长度
int len1;//p1长度
t1=p1;
len1=strlen(t1);
t3=p3;
len3=strlen(t3);
ted=p1+len1;
tnw=p1+len1+len3;
while(ted>=p1+n)
{
*tnw=*ted;
tnw--;
ted--;
}
t1=p1+n;
while(*t3)
{
*t1=*t3;
t1++;
t3++;
}
}
void print(char *p)//输入串函数
{
printf("%s",p);
return;
}