是刘小歪呀
2022-05-13 10:51
采纳率: 100%
浏览 23

数据结构的串的模式匹配bf匹配一直为空

主串和子串匹配不上一直显示匹配位置为空
#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;
 }
  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

1条回答 默认 最新

相关推荐 更多相似问题