C语言数据结构串的模式匹配算法问题

Python017

C语言数据结构串的模式匹配算法问题,第1张

和while循环里面的一样,i指针退回原来的位置并指向下一位,应该是多少?i-j+2是吧!

这里不用指向下一位,直接return它的位置就行了,于是return

i-j+1

i-j+1和i-t[0]相等!

'\0' 是字符的结束符,任何字符串之后都会自动加上'\0'。如果字符串末尾少了‘\0’转义字符,则其在输出时可能会出现乱码问题。

‘\0’转义字符在ASCII表中并不表示阿拉伯数字0,阿拉伯数字0的ASCII码为48,‘\0’转义字符的ASCII码值为0,它表示的是ASCII控制字符中空字符的含义

具体来说,‘\0’是C++中字符串的结尾标志,存储在字符串的结尾。比如char cha[5]表示可以放4个字符的数组,由于c/c++中规定字符串的结尾标志为'\0',它虽然不计入串长,但要占内存空间,而一个汉字一般用两个字节表示,且c/c++中如一个数组cha[5],有5个变量,分别是 cha[0] , cha[1] , cha[2] , cha[3] , cha[4]。

所以cha[5]可以放4个字母(数组的长度必须比字符串的元素个数多1,用以存放字符串结束标志'\0')或者放2个汉字(1个汉字占2个字节,1个字母占一个字节),cha[5]占5个字节内存空间。如果字符串末尾少了‘\0’转义字符,则其在输出时可能会出现乱码问题。

扩展资料

字符串主要用于编程,概念说明、函数解释、用法详述见正文,这里补充一点:字符串在存储上类似字符数组,所以它每一位的单个元素都是可以提取的。

如s=“abcdefghij”,则s[1]=“b”,s[9]="j",而字符串的零位正是它的长度,如s[0]=10(※上述功能Ansistring没有。),这可以给我们提供很多方便,如高精度运算时每一位都可以转化为数字存入数组。

通常以串的整体作为操作对象,如:在串中查找某个子串、求取一个子串、在串的某个位置上插入一个子串以及删除一个子串等。两个字符串相等的充要条件是:长度相等,并且各个对应位置上的字符都相等。

设p、q是两个串,求q在p中首次出现的位置的运算叫做模式匹配。串的两种最基本的存储方式是顺序存储方式和链接存储方式。

修改如下 :

//头文件定义为:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

//#include <malloc.h>

//宏定义:

#define OVERFLOW -2

#define OK 1

#define MAXSTRLEN 255

typedef char SString[MAXSTRLEN+1]

int strLengh(SString S)

{

int m

for(m=1S[m]!='\0'm++)

S[0]=m-1

return 0

}

int Index(SString S,SString T,int pos)

{ //按照普通匹配查找方式查找模式串

int i=pos

int j=1

while(i<=(int)S[0] &&j<=(int)T[0])

{

if(S[i]==T[j])

{

++i

++j

}

else

{

i=i-j+2

j=1

}

}

if(j>T[0])

return i-T[0]

else return 0

}//Index

void get_next(SString T,int next[])

{ //求KMP算法中的next函数值,并存入数组next[]

int i=1

next[1]=0

int j=0

while(i<(int)T[0])

{

if(j==0 || T[i]==T[j])

{

++i

++j

next[i]=j

}

else j=next[j]

}

}//next

int get_nextval(SString T,int nextval[])

{

int i=1

nextval[1]=0

int j=0

while(i<(int)T[0])

{

if(j==0 || T[i]==T[j])

{

++i

++j

if(T[i]!=T[j])

nextval[i]=j

else

nextval[i]=nextval[j]

}

else j=nextval[j]

}

return 0

}//nextval

int Index_KMP(SString S,SString T,int pos,int next[])

{//KMP算法的实现过程

int i=pos

int j=1,k=0

while(i<=(int)S[0] &&j<=(int)T[0])

{

if(j==0 || S[i]==T[j])

{

++i

++j

}

else

{

j=next[j]

}

}

if(j>(int)T[0])

return i-T[0]

else return 0

}//Index_KMP

void main()

{

SString T,S

char *p

int pos

int k1,k2,k

int i,j

int next[MAXSTRLEN]

int nextval[MAXSTRLEN]

printf("请输入字符串匹配主串:\n")

p=&S[1]

gets(p)

printf("请输入字符串匹配模式串:\n")

p=&T[1]

gets(p)

printf("您输入的字符串匹配中主串为:\n")

p=&S[1]

puts(p)

printf("您输入的字符串匹配中模式串为:\n")

p=&T[1]

puts(p)

printf("请您输入起始位置pos:")

scanf("%d",&pos)

strLengh(S)

strLengh(T)

printf("\n----------运用普通算法------------\n")

printf("\n")

if(k1=Index(S,T,pos))

printf("匹配成功!\n普通匹配算法得模式串位置:%d\n",k1)

else

printf("没有找到,匹配失败!\n")

printf("\n----------运用KMP算法------------\n")

get_next(T,next)

printf("得到T的next[]序列为:")

for(i=1i<=T[0]i++)

printf("%d",next[i])

get_nextval(T,nextval)

printf("\n得到T的nextval[]序列为:")

for(i=1i<=T[0]i++)

printf("%d",nextval[i])

printf("\n")

if(k2=Index_KMP(S,T,pos,next))

printf("匹配成功!\nKMP算法得模式串位置:%d\n",k2)

else

printf("没有找到,匹配失败!")

}