是刘小歪呀 2022-05-13 10:51 采纳率: 100%
浏览 26
已结题

数据结构的串的模式匹配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条回答 默认 最新

  • 浪客 2022-05-13 15:51
    关注
    
    int StrIndex(SString T,int pos,SString S)//模式匹配
    {
        //求从主串T的下标pos起,串S第一次出现的位置,成功返回位置序号,不成功返回-1
        int i=pos,j=0,x;
    
        while(i<T.length-S.length)//剩余长度小于S长度,肯定不匹配
        {
            j=0;
            if(T.ch[i]==S.ch[j])//T中字符与S首字符相同,开始测试匹配
            {
                j++;
                while(j<S.length)
                {
                    if(T.ch[i+j]!=S.ch[j])
                        break;
                    j++;                
                }
                if(j==S.length)
                    return i;                        
            }
            i++;
        }
        return -1;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月22日
  • 已采纳回答 5月14日
  • 创建了问题 5月13日

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能