标题:在主串中找子串,输出不了第一次匹配成功的位置orz
只看楼主
枫羽熠
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-11-4
结帖率:100%
已结贴  问题点数:20 回复次数:2 
在主串中找子串,输出不了第一次匹配成功的位置orz
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#include <iostream>
using namespace std;
typedef  int  Status;

#define MAXLEN 255
typedef struct{
    char ch[MAXLEN+1];
    int length;
}SString;

void StrAssign(SString &S)  
{
int i;
char chars[MAXLEN+1];
cin>>chars;
for(i=0;chars[i]!='\0';i++)
S.ch[i]=chars[i];
S.length=i;
}

void OutString(SString S)
{
int i;
if(S.length>0)
{
for(i=0;i<S.length;i++)
printf("%c",S.ch[i]);
printf("\n");
}
}

int StrLength(SString S)
{
return S.length;
}

int Index_KMP(SString S,SString T,int nextval[])
{
int i,j;
i=1;j=1;
while(i<=S.length&&j<=T.length)
{
    if(j==0||S.ch[i]==T.ch[j]){++i;++j;}
    else j=nextval[j];
}
if(j>T.length)return i-T.length;
else return 0;
}

void get_nextval(SString T,int nextval[])
{
int i,j;
i=1;nextval[1]=0;j=0;
while(i<=T.length)
{
if(j==0||T.ch[i]==T.ch[j])
{
++i;++j;
if(T.ch[i]!=T.ch[j]) nextval[i]=j;
else nextval[i]=nextval[j];
}
else j=nextval[j];
}
}


int main()
{int a,b;
int nextval[MAXLEN+1];
SString S;
SString T;
cout<<"请输入主串S:"<<endl;
StrAssign(S);
printf("S为:");
OutString(S);
printf("串长度为:");
a=StrLength(S);
printf("%d\n",a);
printf("\n");
cout<<"请输入子串T:"<<endl;
StrAssign(T);
printf("T为:");
OutString(T);
printf("串长度为:");
b=StrLength(T);
printf("%d\n",b);
get_nextval(T,nextval);
if(Index_KMP(S,T,nextval)){
printf("子串在主串中位置为:\n");
printf("%d\n",Index_KMP(S,T,nextval));}
else printf("主串中不存在该子串");
}
比如,S为:aaaaa(5个a),T为:a,显示的位置却为5,求大神搭救,我是刚入门的小白orz
搜索更多相关主题的帖子: 子串 位置 int length printf 
2017-11-04 14:10
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:20 
字符串搜寻也可以用 strstr()
2017-11-04 15:30
枫羽熠
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-11-4
得分:0 
回复 2楼 吹水佬
谢谢谢谢谢谢,我知道可以用strstr函数查找,只是我现在在学习KMP算法,所以想试试这种方法哈哈。按我的理解,我觉得我这个代码输出的就是第一次找到的位置了,明明没有循环,可是总是输出最后一次找到的位置,不过还是谢谢大佬!!!
2017-11-04 15:47



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-482118-1-1.html




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

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