粗看了一下:
/*以下为我自己仿写的strstr函数*/
/*当然此例程还可以优化,欢迎大家提出改进意见*/
#include<stdio.h>
int main(void)
{
char *str1="eerytytuyumkeiakbcdke1";
char *str2="cdk";
int pos=0;
int my_strstr(char *s,char *t);/*函数声明*/
int next(char *p,int j); /*函数声明*/
pos=my_strstr(str1,str2);
printf("pos=%d\n",pos);
getch();
return 0;
}
/*函数功能:模式字符串匹配*/
/*入口参数:s为一给定字符串指针,t模式字符串指针*/
/*出口参数:pos为字符串t在字符串s中的位置。*/
/*若pos为-1则没有找到相匹配的字符串,否则找到*/
int my_strstr(char *s,char *t)
{
int i=0; /*变量i用于标记指针s_trace从当前位置移到下一位置的长度*/
int j=0; /*变量j作为函数int next(char *p,int j)的参数*/
int pos=0; /*标记模式串t在字符串s的位置*/
char *s_save=s;/*指针s_save用于保存字符串s的首地址*/
char *t_save=t;/*指针t_save用于保存字符串t的首地址*/
char *s_trace=s;/*指针s_trace用于跟踪和初始化指针s*/
while((*s)!='\0')
{
while((*t)!='\0')
{
if((*s)==(*t))
{
t++;
s++;
}
else
break;
}
if(*t=='\0')
{
return pos; /*匹配成功,返回*/
}
else
{
j=s-s_trace-1;/*计算s指针相对于s_trace指针的距离*/
/*问题一,这个j有必要吗? */
if(s==s_trace)
{
i+=1;/*在每一次匹配时若第一次不匹配,则步
长为1*/
}
else /*否则调用函数next()确定下一次
的s_trace值*/
{
i=next(t_save,j);/*函数调用*/
/*问题二,这个if的处理有问题,原因就是后面
有s=s_trace; */
}
/*进入下一次匹配*/
s_trace=s_trace+i; /*根据变量i调整s_trace指针*/
s=s_trace; /*重新初始化s指针*/
t=t_save; /*调整指针t,使它重新指向开始位置*/
pos=s_trace-s_save;/*根据偏移量赋值*/
i=0; /*重新初始化i*/
}
}
return -1;
}
/*函数功能:确定字符串t从当前位置向后滑动多远的距离*/
/*入口参数:p即为模式串t的首地址;j为从s_trace到s的距离*/
/*出口参数:j即为字符串t从当前位置向后滑动多远的距离*/
int next(char *p,int j)
{
int i=0;/*用于控制循环*/
char *p_save=p;
char *p1_trace=(p+1);/*p1_trace跟踪每一次p1的初值,并在下一次
为p1赋初值*/
char *p1=p1_trace;
while(i<=j)
{
while(*p==*p1)
{
p1++;
p++;
}
if(p1>(p_save+j))
{
j=p1_trace-p_save;/*查找到下一个位置,返回*/
return j;
}
else /*否则,重新初始化p1_trace,p1,p
进入下一次匹配*/
{
p1_trace++;
p1=p1_trace;
p=p_save;
}
i++;
}
/*没有查找到,返回j+1,即从传入的j位置之后在strstr函数中
进行下一次匹配*/
j++;
return j;
}
还有就是写得太累赘了。