鱼C论坛

 找回密码
 立即注册
查看: 4400|回复: 4

求解决串的模式匹配问题

[复制链接]
发表于 2013-5-17 08:12:22 | 显示全部楼层 |阅读模式
5鱼币
#include<stdio.h>
#define MaxSize 100
typedef struct
{
    char str[MaxSize];
    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[i] == T.str[j])
        {
            i++;
            j++;
        }
        else
        {
            i=i-j+1;
            j=0;
        }
    }
   
    if(j == T.length)
    v=i-T.length;
    else
    v=-1;
    return v;

}

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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[MaxSize];
        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:

1.jpg
结果2:
2.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-17 17:40:22 | 显示全部楼层
小错误大麻烦啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-5-17 20:13:25 | 显示全部楼层

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


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

typedef struct
{
        DataType stack[MaxStackSize];
        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[S->top] = 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[S->top];
                return 1;
        }
}

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

typedef struct
{
    DataType queue[MaxQueueSize];
    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[Q->rear] =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 =(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[Q.front];
        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[i]);
        StackPush(&myStack,str[i]);
    }
   
    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);
}

谢谢你,你好人帮到底,在帮我查一个错吧
类似的错误,能运行,但明明是回文,却显示不是回文
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-22 10:15:11 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 16:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表