利用最小操作子集实现定位函数
#include <stdio.h>
#define MaxLen 256
typedef struct
{
char str[MaxLen]; /*定义可容纳MaxLen个字符的字符数组*/
int curlen; /*定义当前实际串长度*/
} SString;
void InitString(SString *s,char a[])
{
int i,j;
for(j=0;a[j]!='\0';j++);
for(i=0;i<j;i++)
s->str[i]=a[i];
s->curlen=j;
}
void show(SString S)
{
int i;
for(i=0;i<S.curlen;i++)
printf("%c",S.str[i]);
printf("\n字符串实际长度是:%d",S.curlen);
}
int StrLength(SString s){
}
int StrEqual(SString s,SString t)
/*判串s和串t是否相等。相等,返回l;否则返回0*/
{
int i,j;
if(s.curlen==t.curlen) /*首先判断两个串的长度是否相等*/
{
for(i=0;i<s.curlen;i++) /*长度相等则继续比较对应位置的每个字符是否相等*/
{
if(s.str[i]==t.str[i])
j=1;
else
{
j=0; /*若对应位置字符出现不等,终止比较*/
break;
}
}
}
else /*长度不相等则判定两个串不相等,返回0*/
j=0;
return j;
}
SString SubStr(SString s,int pos,int len)
/*求出串s中从第pos个字符起长度为len的子串*/
{
int i,j=0;
SString ch;
if((pos>=1 && pos<=s.curlen) && (len>=0 && len<= s.curlen- pos+1))
{
for(i=pos-1;i<len+pos-1;i++)
{ /*将s.str[pos-1]~ s.str[1en+pos-2]复制至ch*/
ch.str[j++]=s.str[i];
}
ch.curlen=len;
ch.str[ch.curlen]= '\0';
}
else
{
printf("\n error! \n"); /*参数不正确时返回错误信息*/
}
return ch;
}
int StrIndex (SString s, SString t, int pos)
/* t为非空串。若主串s中第pos个字符之后存在与t相等的子串,则返回第一个这样的子串在s中的位置,否则返回-1。*/
{
SString sub;
int m,n,i;
if (pos>0)
{
n = s.curlen;
m = t.curlen;
i = pos;
while (i<=n-m+1)
{
sub=SubStr(s,i,m);
//printf("%d",i);
//show(sub);
if (StrEqual(sub,t) != 0)
++i;
else
return i; /* 返回子串在主串中的位置*/
}
}
return -1; /* s中不存在与t相等的子串*/
}
main()
{
SString S,T;
char a[MaxLen],b[MaxLen];
int wz,x;
printf("\n请输入主串S:");
gets(a);
printf("\n请输入子串T:");
gets(b);
InitString(&S,a);
InitString(&T,b);
printf("\n主串S:");show(S);
printf("\n子串T:");show(T);
printf("\n请输入开始搜索的位置:");
scanf("%d",&wz);
x=StrIndex(S,T,wz);
printf("\n子串在主串的位置是%d\n",x);
}