| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 938 人关注过本帖
标题:串模式的匹配
只看楼主 加入收藏
寻梦飞翔
Rank: 1
等 级:新手上路
帖 子:76
专家分:9
注 册:2010-3-15
结帖率:94.12%
收藏
已结贴  问题点数:10 回复次数:17 
串模式的匹配
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100
typedef struct str
{
  char ch[MAXSIZE];
  int length;
}str;
void enstr(str ch)//输入字符串
{ int i;
  char *p;
  p=ch.ch;
  gets(p);
  while(*p)
  {
    i++;
    p++;
  }
  ch.length=i;
}
int index(str s,str t,int pos)
{
  int i=pos,j=1;
  while(i<=s.length&&j<=t.length)
  {
    if(s.ch[i]==t.ch[i])
    {
      i++;
      j++;
    }
    else
    {
      i=i-j+2;
      j=1;
    }
  }
  if(j>t.length)
  return i-t.length;
  else
  return 0;
}
main()
{ str s,t;
  int pos,pos2;
  enstr(s);
  enstr(t);
  scanf("%d",&pos);
  pos2=index(s,t,pos);
  printf("%d",pos2);
 
}

有问题,自己发现不了,麻烦高手指点一下……谢谢!
搜索更多相关主题的帖子: 模式 
2010-04-12 19:34
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:0 
你的s t没有初始化  它把什么传给形参呢?
2010-04-12 20:48
寻梦飞翔
Rank: 1
等 级:新手上路
帖 子:76
专家分:9
注 册:2010-3-15
收藏
得分:0 
那应该怎样初始化啊?
2010-04-12 20:54
寻梦飞翔
Rank: 1
等 级:新手上路
帖 子:76
专家分:9
注 册:2010-3-15
收藏
得分:0 
正确的代码应该怎样写啊? 谢谢……
2010-04-12 20:56
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:2 
你可以将其设置为全局变量 不进行传参

或者 主函数里进行字符输入
2010-04-12 20:57
freegod
Rank: 2
等 级:论坛游民
帖 子:33
专家分:73
注 册:2010-4-12
收藏
得分:5 
自己之前写了一个:
#include<stdio.h>
#include<string.h>
#define maxstrlen 255
int next[50];
void Input(char c[])
{
    int i=0,j=0;
    printf("Please intput the character string:");
    while((c[++j]=getchar())!=10)i++;
    c[0]=i;
}
int Index(char s[],char p[])                  //字符串匹配的简单算法
{
    int i,j,m,n,flag=0;
    i=1;j=1;
    m=p[0];
    n=s[0];
    while((j<=m)&&(i<=n))
    {
        if(s[i]==p[j])
        {
              i+=1;
            j+=1;
        }
        else{i=i-j+2;j=1;}
        if(j==m+1){flag=i-1;break;}
    }
    return (flag);
}
int Index_KMP(char s[],char p[])          //KMP算法
{
    int i,j,m,n,flag=0;
    i=1;j=1;
    m=p[0];
    n=s[0];
    while(j<=m&&i<=n)
    {
        if(j==0||s[i]==p[j])
        {
            i+=1;
            j+=1;
        }
        else j=next[j];        //模式串向右滑行j-next[j]个位置
    }
    if(j==m+1)flag=i-m+1;
    return flag;
}
void get_next(char p[],int next[])            //求next[]数组的函数
{
    int i=1,j=0,m;
    next[1]=0;
    m=p[0];
    while(i<m)
    {
        if((j==0)||(p[i]==p[j]))
        {
            ++i;++j;
            if(p[i]!=p[j])next[i]=j;
            else next[i]=next[j];
        }
        else j=next[j];
    }
}
   

void main()
{
    char s[maxstrlen],p[maxstrlen];
    int f,g;
    Input(s);
    Input(p);
    get_next(p,next);
    f=Index(s,p);//使用简单算法匹配
    g=Index_KMP(s,p);//使用KMP算法匹配
    if(f==0&&g==0)printf("Sorry.\n");//匹配不成功
    else printf("Yes,%d,%d.\n",f,g);//匹配成功

}

        



[ 本帖最后由 freegod 于 2010-4-13 08:37 编辑 ]
2010-04-12 21:12
freegod
Rank: 2
等 级:论坛游民
帖 子:33
专家分:73
注 册:2010-4-12
收藏
得分:0 
楼主可以参考一下
2010-04-12 21:13
寻梦飞翔
Rank: 1
等 级:新手上路
帖 子:76
专家分:9
注 册:2010-3-15
收藏
得分:0 
#include<stdio.h>
#include<string.h>
#define maxstrlen 255
int next[50];
void Input(char c[])
{
    int i=0,j=0;
    printf("Please intput the character string:");
    while((c[++j]=getchar())!=10)i++;//这句不是很懂,麻烦解释一下,谢谢……
    c[0]=i;
}
int Index(char s[],char p[])                  //字符串匹配的简单算法
{
    int i,j,m,n,flag=0;
    i=1;j=1;
    m=p[0];
    n=s[0];
    while((j<=m)&&(i<=n))
    {
        if(s[i]==p[j])
        {
              i+=1;
            j+=1;
        }
        else{i=i-j+2;j=1;}
        if(j==m+1){flag=i-1;break;}
    }
    return (flag);
}
int Index_KMP(char s[],char p[])          //KMP算法
{
    int i,j,m,n,flag=0;
    i=1;j=1;
    m=p[0];
    n=s[0];
    while(j<=m&&i<=n)
    {
        if(s[i]==p[j])
        {
            i+=1;
            j+=1;
        }
        else j=next[j];        //模式串向右滑行j-next[j]个位置
        if(j==m+1){flag=i-1;break;}
    }
    return flag;
}
void get_next(char p[],int next[])            //求next[]数组的函数
{
    int i=1,j=0,m;
    next[1]=0;
    m=p[0];
    while(i<m)
    {
        if((j==0)||(p[i]==p[j]))
        {
            ++i;++j;
            next[i]=j;
        }
        else j=next[j];
    }
}
void main()
{
    char s[maxstrlen],p[maxstrlen];
    int f,g;
    Input(s);
    Input(p);
    get_next(p,next);
    f=Index(s,p);//使用简单算法匹配
    g=Index_KMP(s,p);//使用KMP算法匹配
    if(f==0&&g==0)printf("Sorry.\n");//匹配不成功
    else printf("Yes,%d,%d.\n",f,g);//匹配成功
}
2010-04-12 21:45
寻梦飞翔
Rank: 1
等 级:新手上路
帖 子:76
专家分:9
注 册:2010-3-15
收藏
得分:0 
就是具体怎样输入啊,我运行后没反应啊……
2010-04-12 21:56
freegod
Rank: 2
等 级:论坛游民
帖 子:33
专家分:73
注 册:2010-4-12
收藏
得分:0 
回复 8楼 寻梦飞翔
while((c[++j]=getchar())!=10)i++;//这句不是很懂,麻烦解释一下,谢谢……
    c[0]=i;
这句是控制输入,当输入enter时,结束,enter键在ASCII里面值是10。i++是统计你输入的字符个数。
2010-04-12 21:59
快速回复:串模式的匹配
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012978 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved