你在函数内给形参malloc内存,这些内存在函数返回时会被回收,因此相当于你没有分配内存。
解决的方法就是在main中分配内存,而不是在create中,或者也可以将create函数改一下:
Sqstring *StrCreate()
{
int i
s=(Sqstring*)malloc(sizeof(Sqstring))
printf("请输入字符串(长度不超过%d)!\n",Maxsize)
for(i=0i<Maxsizei++)
{
scanf("%c",s->data[i])
if(s->data[i]=='1')
break
}
s->length=i
return s
}
调用时先声明一个串指针
Sqstring *s
s = StrCreate()
这样就可以了
#include <cstring>#include <iostream>
using namespace std
//修正后的求next数组各值的函数代码
void get_nextval(char const* ptrn, int plen, int* nextval)
{
int i = 0 //i是从0开始的
nextval[i] = -1
int j = -1
while( i <plen-1 )
{
if( j == -1 || ptrn[i] == ptrn[j] ) //循环的if部分
{
++i
++j
if( ptrn[i] != ptrn[j] ) //++i,++j之后,再次判断ptrn[i]与ptrn[j]的关系
nextval[i] = j
else
nextval[i] = nextval[j]
}
else //循环的else部分
j = nextval[j]
}
}
void print_progress(char const* src, int src_index, char const* pstr, int pstr_index)
{
cout<<src_index<<"\t"<<src<<endl
cout<<pstr_index<<"\t"
for( int i = 0i <src_index-pstr_index++i )
cout<<" "
cout<<pstr<<endl
cout<<endl
}
//int kmp_seach(char const*, int, char const*, int, int const*, int pos) KMP模式匹配函数
//输入:src, slen主串
//输入:patn, plen模式串
//输入:nextval KMP算法中的next函数值数组
int kmp_search(char const* src, int slen, char const* patn, int plen, int const* nextval, int pos)
{
int i = pos
int j = 0
while ( i <slen &&j <plen )
{
if( j == -1 || src[i] == patn[j] )
{
++i
++j
}
else
{
j = nextval[j]
//当匹配失败的时候直接用p[j_next]与s[i]比较,
//下面阐述怎么求这个值,即匹配失效后下一次匹配的位置
}
}
if( j >= plen )
return i-plen
else
return -1
}
int main()
{
std::string src = "aabcabcebafabcabceabcaefabcacdabcab"
std::string prn = "abac"
int* nextval = new int[prn.size()]
//int* next = new int[prn.size()]
get_nextval(prn.data(), prn.size(), nextval)
//get_next(prn.data(), prn.size(), next)
for( int i = 0i <prn.size()++i )
cout<<nextval[i]<<"\t"
cout<<endl
cout<<"result sub str: "<<src.substr( kmp_search(src.data(), src.size(), prn.data(), prn.size(), nextval, 0) )<<endl
system("pause")
delete[] nextval
return 0
}
望楼主采纳!