这里不用指向下一位,直接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("没有找到,匹配失败!")
}