檀卉 发表于 2013-5-17 08:12:22

求解决串的模式匹配问题

#include<stdio.h>
#define MaxSize 100
typedef struct
{
    char str;
    int length;
}String;
void main()
{
    String myString1 ={"I am a student!",15},
         myString2 ={"am",2};
         
    int i;
    int BFIndex(String S,int start,String T);
    i=BFIndex(myString1,0,myString2);
    printf("主串是:%s\n",&myString1);
    printf("子串是:%s\n",&myString2);
    if(i=-1)
      printf("主串中不存在该子串!\n");
      else
      printf("主串中存在该子串,在主串的%d位置开始",i);
}

int BFIndex(String S,int start,String T)
{
    int i=start,j=0,v;
    while(i<S.length && j<T.length)
    {
      if(S.str == T.str)
      {
            i++;
            j++;
      }
      else
      {
            i=i-j+1;
            j=0;
      }
    }
   
    if(j == T.length)
    v=i-T.length;
    else
    v=-1;
    return v;
}

代码如上,问题是:明明主串中有该字串,可运行后怎么就出现不存在该字串呢?
求高手相助,指点迷津,不甚感激

小新110 发表于 2013-5-17 09:39:34

比较函数很凌乱,没看懂,重写了一个
比较结果的地方有个很低级的错误哦:
if(i=-1)   ===>>if(i == -1)

#include<stdio.h>
#include <string.h>
#define MaxSize 100
typedef struct
{
        char str;
        int length;
}String;
void main()
{
        String myString1 ={"I am a student!",15},
                myString2 ={"am",2};
                //myString2 ={"an",2};

        int i;
        int BFIndex(String S,int start,String T);
        i=BFIndex(myString1,0,myString2);
        printf("主串是:%s\n",&myString1);
        printf("子串是:%s\n",&myString2);
        if(i==-1)
                printf("主串中不存在该子串!\n");
        else
                printf("主串中存在该子串,在主串的%d位置开始",i);

        _flushall();
        getchar();
}

int BFIndex(String S,int start,String T)
{
        int v=0;
        char*ch1=NULL;
        char*ch2=NULL;
        ch1 = S.str;
        ch2 = T.str;
        while(ch1!=NULL)
        {
                if (memcmp(ch1++,ch2,T.length))
                {
                        v++;
                }else
                {
                        break;
                }
        }
        if (v>S.length)
        {
                v=-1;
        }
        return v;
}结果1:

结果2:

252013680 发表于 2013-5-17 17:40:22

小错误大麻烦啊

檀卉 发表于 2013-5-17 20:13:25

小新110 发表于 2013-5-17 09:39 static/image/common/back.gif
比较函数很凌乱,没看懂,重写了一个
比较结果的地方有个很低级的错误哦:
if(i=-1)   ===>>if(i == -1 ...

#include<stdio.h>
#include<string.h>


#define MaxQueueSize 100
#define MaxStackSize 100
typedef char DataType;
/*typedef char DataType;*/

typedef struct
{
        DataType stack;
        int top;
}SeqStack;
       
void StackInitiate(SeqStack *S)
{
        S->top = 0;
}

int StackNotEmpty(SeqStack S)
{
        if(S.top <= 0)
        return 0;
        else
        return 1;
}

int StackPush(SeqStack *S, DataType x)
{
        if(S->top >= MaxStackSize )
        {
                printf("堆栈已满无法插入!\n");
                return 0;
        }
        else
        {
                S->stack = x;
                S->top ++;
                return 1;
        }
}

int StackPop(SeqStack *S, DataType *d)
{
        if(S->top <=0)
        {
                printf("堆栈已空无数据元素出栈!\n");
                return 0;
        }
        else
        {
                S->top --;
                *d =S->stack;
                return 1;
        }
}

int StackTop(SeqStack S, DataType *d)
{
        if (S.top <= 0)
        {
                printf ("堆栈已空!\n");
                return 0;
        }
        else
        {
                *d = S.stack;
                return 1;
        }
}

typedef struct
{
    DataType queue;
    int rear;
    int front;
    int count;
}SeqCQueue;

void QueueInitiate(SeqCQueue *Q)
{
    Q->rear =0;
    Q->front =0;
    Q->count= 0;
}

int QueueNotEmpty(SeqCQueue Q)
{
    if(Q.count !=0)
      return 0;
    else
      return 0;
}

int QueueAppend(SeqCQueue *Q,DataType x)
{
    if(Q->count > 0 && Q->rear == Q->front)
    {
      printf("队列已满无法插入!\n");
      return 0;
    }
    else
    {
      Q->queue =x;
      Q->rear =(Q->rear +1)%MaxQueueSize;
      Q->count++;
      return 1;
    }
}

int QueueDelete(SeqCQueue *Q,DataType *d)
{
    if(Q->count == 0)
    {
      printf("队列已空无数据元素出队列!\n");
      return 0;
    }
    else
    {
      *d=Q->queue;
      Q->front =(Q->front + 1)%MaxQueueSize;
      Q->count--;
      return 1;
    }
}

int QueueGet(SeqCQueue Q,DataType *d)
{
    if(Q.count ==0)
    {
      printf("队列已空无数据元素可取!\n");
      return 0;
    }
    else{
      *d =Q.queue;
      return 1;
    }
}




void HuiWen(char str[])
{
    SeqCQueue myQueue;
    SeqStack myStack;
    char x,y;
    int i,length;
   
    length = strlen(str);
    QueueInitiate(&myQueue);
    StackInitiate(&myStack);
    for(i=0;i<length;i++)
    {
      QueueAppend(&myQueue,str);
      StackPush(&myStack,str);
    }
   
    while(QueueNotEmpty(myQueue) == 1 && StackNotEmpty(myStack) == 1)
    {
      if(QueueDelete(&myQueue,&x) == 1
      && StackPop(&myStack,&y) == 1 && x != y)
      {
            printf("%s不是回文!\n",str);
            return;
      }
    }
   
    if(QueueNotEmpty(myQueue) || StackNotEmpty(myStack))
       printf("%s不是回文!\n",str);
    else
       printf("%s是回文!\n",str);
}


void main()
{
    char str1[]="ABCDEDCBA";
    char str2[]="ABCDEDCAB";
   
    HuiWen(str1);
    HuiWen(str2);
}

谢谢你,你好人帮到底,在帮我查一个错吧
类似的错误,能运行,但明明是回文,却显示不是回文

小号4 发表于 2013-6-22 10:15:11

强烈支持楼主ing……
页: [1]
查看完整版本: 求解决串的模式匹配问题