主串和子串匹配不上一直显示匹配位置为空
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define CHUNKSIZE 255
typedef struct{ //串的定义
char *ch;//存储串的一堆数据
int length;//串当前的长度
}SString;
int StrAssign(SString &T,char *chars)//生成一个其值等于串常量的T
{
int i,n;char *c;
for(i=0,c=chars;*c;++i,++c);
if(!i)
{
T.ch=NULL;
T.length=0;
}//串常量chars的T为空,T的长度为0
else
{
if(!(T.ch=(char*)malloc(i*sizeof(char))))//动态申请生成char的空间
return -1;
for(n=0;n<=i-1;n++)
{
T.ch[n]=chars[n];
T.length=i;
}//串T的长度为n
}
return 1;
}//串的初始化
int StrCompare(SString T,SString S)
{//若串t和s相等则返回0;若t>s则返回正数;若t<s则返回负值
int i;
for(i=0;i<T.length&&i<S.length;i++)
{
if(S.ch[i]!=T.ch[i])
return S.ch[i]-T.ch[i];
else
return S.length-T.length;
}
}
int StrIndex(SString T,int pos,SString S)//模式匹配
{
//求从主串T的下标pos起,串S第一次出现的位置,成功返回位置序号,不成功返回-1
int i=pos,j=0;
while(i<T.length&&j<S.length)
{
if(T.ch[i]==S.ch[j])
{
i++;j++;
}//当前对应字符相等时推进
else{
i=i-j+1;
j=0;
}//当前字符不相等时回溯
}
if(j>=S.length+1)
return (i=T.length);//若匹配成功,返回匹配起始位置
else
return(0);//匹配不成功时,返回-1
}
void show()
{
printf("请输入想选择的指令:\n");
printf("1.显示两条串\n");
printf("2.两串作比较:\n");
printf("3.bf匹配:\n");
printf("0.退出\n");
printf(" \n");
}
int main()
{
int n,i;
SString T;
SString S;
show();
char t[15]="cggvhjbjvs\0";
T.ch=t;
for(i=0;T.ch[i]!='\0';i++)
T.length=i+1;
//StrAssign(T,t);//定义主串
char s[5]="jbj\0";
S.ch=s;
for(i=0;S.ch[i]!='\0';i++)
S.length=i+1;
//StrAssign(S,s);//定义子串
scanf("%d",&n);
while(n!=0)
{
switch(n)
{
case 1:
printf("主串:%s \n",T.ch);
printf("子串:%s \n",S.ch);
break;
case 2:
int m;
m=StrCompare(T,S);
if(m!=0)
if(m>0)
printf ("前面长 \n");
else
printf("后串长 \n");
else printf("两串一样长 \n");
break;
case 3:
int j;
j=StrIndex(T,1,S);
if(j==-1)
{
printf ("匹配失败 \n");
}
else
{
printf ("匹配位置为:%s \n",j);
}
break;
}
scanf("%d",&n);
}
return 0;
}