是刘小歪呀 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日

悬赏问题

  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址
  • ¥15 elmos524.33 eeprom的读写问题