主题:请教 debug assertion 错误
[color=000000][[size=6][size=3][size=1]b]本程序大家不用细心看懂,直接它拷下来在机器上运行就可以了,我觉得问题不在程序本身。[/b][/size][/size][/size][/color]
测试数据:input7.txt
2
I am a student student student
I am a teacher
student
teacher
/*本算法是用类实现,采用kmp算法进行匹配查找*/
#include "iostream"
using namespace std;
#define MAXLEN 50//字符串的最大长度
#define MAXNUM 20//字符串的最大个数
class String
{
int length;
char strings[MAXLEN];
public:
String()
{
length=0;
for (int i=0;i<MAXLEN;i++)
{
strings[i]=NULL;
}
}
void StringAssign(char *tp)
{
int temp=strlen(tp);
if(tp[temp-1]==10)//由于tp字符串可能没有结束答,可能导致字符串长度出错
length=temp-1;
else length=temp;
strcpy(strings+1,tp);//0单元不赋值
}
int Get_len() const
{
return length;
}
void print()
{
char *tp=strings+1;
cout<<tp;//tp中已有换行符
}
friend void Get_next(const String &T,int *next);
friend int Match(const String &M,const String &T,int *next,int pos);
friend void Replace(String &M,const String &V,int &pos);
};
void Get_next(const String &T,int *next)//求next数组值
{
next[1]=0;
next[2]=1;
int j=2, k=1;
for(;j<=T.length;j++)
{
while(T.strings[j]!=T.strings[k]&&k)
k=next[k];
next[j+1]=k+1;
k=next[j+1];
}
}
int Match(const String &M,const String &T,int *next,int pos)//kmp算法
{
int i=pos,j=1;
while (i<=M.length&&j<=T.length)
{
if(j==0||M.strings[i]==T.strings[j]) {i++;j++;}
else j=next[j];
}
if(j>T.length) return i-T.length;//返回插入的位置
else return 0;
}
void Replace(String &M,const String &V,int &pos)//用V替换M中的T子串
{
for(int i=1;i<=V.length;i++)
M.strings[i+pos-1]=V.strings[i];
}
int main()
{
FILE *fp;
if (fp=fopen("input7.txt","r"))
{
int num=0;//字符主串个数
fscanf(fp,"%d",&num);
char temp[MAXLEN];//读入整数后面的空格字符
fgets(temp,MAXLEN,fp);//这种情况只在不同输入格式时存在
String *str=new(String[num]);
char *tp=new char[MAXLEN];
for (int i=0;i<num;i++)//读入n个字符串
{
fgets(tp,MAXLEN,fp);
str[i].StringAssign(tp);
}
String T,V;//读入T,V子串
fgets(tp,MAXLEN,fp);
T.StringAssign(tp);
int len=T.Get_len();
int *next=new int[len];
if(len>1)
Get_next(T,next);//求数组next值
else next[1]=0;
fgets(tp,MAXLEN,fp);
V.StringAssign(tp);
delete tp;//释放空间
for(i=0;i<num;i++)//替换各子串存在的T子串
{
int flag[MAXLEN]={1,};
flag[1]=Match(str[i],T,next,1);//找到替换位置
for(int j=flag[1]+T.Get_len(),k=2;j<=str[i].Get_len()&&k<=str[i].Get_len()+1;k++)
{//将主串中的所有T子串中替换掉
if(!flag[1])
{
cout<<flag[1]<<endl;
j=str[i].Get_len()+1;
}
else
{
Replace(str[i],V,flag[k-1]);
flag[k]=Match(str[i],T,next,j);
j=flag[k]+T.Get_len();
}
}
if (flag[1])
{
Replace(str[i],V,flag[k-1]);
str[i].print();
}
}
delete []str;
//delete []next;这个问题我不能解释
fclose(fp);
}
return 0;
}[em8][em10][em5][em5][em5][em5][em5][em5][em5][em5]
测试数据:input7.txt
2
I am a student student student
I am a teacher
student
teacher
/*本算法是用类实现,采用kmp算法进行匹配查找*/
#include "iostream"
using namespace std;
#define MAXLEN 50//字符串的最大长度
#define MAXNUM 20//字符串的最大个数
class String
{
int length;
char strings[MAXLEN];
public:
String()
{
length=0;
for (int i=0;i<MAXLEN;i++)
{
strings[i]=NULL;
}
}
void StringAssign(char *tp)
{
int temp=strlen(tp);
if(tp[temp-1]==10)//由于tp字符串可能没有结束答,可能导致字符串长度出错
length=temp-1;
else length=temp;
strcpy(strings+1,tp);//0单元不赋值
}
int Get_len() const
{
return length;
}
void print()
{
char *tp=strings+1;
cout<<tp;//tp中已有换行符
}
friend void Get_next(const String &T,int *next);
friend int Match(const String &M,const String &T,int *next,int pos);
friend void Replace(String &M,const String &V,int &pos);
};
void Get_next(const String &T,int *next)//求next数组值
{
next[1]=0;
next[2]=1;
int j=2, k=1;
for(;j<=T.length;j++)
{
while(T.strings[j]!=T.strings[k]&&k)
k=next[k];
next[j+1]=k+1;
k=next[j+1];
}
}
int Match(const String &M,const String &T,int *next,int pos)//kmp算法
{
int i=pos,j=1;
while (i<=M.length&&j<=T.length)
{
if(j==0||M.strings[i]==T.strings[j]) {i++;j++;}
else j=next[j];
}
if(j>T.length) return i-T.length;//返回插入的位置
else return 0;
}
void Replace(String &M,const String &V,int &pos)//用V替换M中的T子串
{
for(int i=1;i<=V.length;i++)
M.strings[i+pos-1]=V.strings[i];
}
int main()
{
FILE *fp;
if (fp=fopen("input7.txt","r"))
{
int num=0;//字符主串个数
fscanf(fp,"%d",&num);
char temp[MAXLEN];//读入整数后面的空格字符
fgets(temp,MAXLEN,fp);//这种情况只在不同输入格式时存在
String *str=new(String[num]);
char *tp=new char[MAXLEN];
for (int i=0;i<num;i++)//读入n个字符串
{
fgets(tp,MAXLEN,fp);
str[i].StringAssign(tp);
}
String T,V;//读入T,V子串
fgets(tp,MAXLEN,fp);
T.StringAssign(tp);
int len=T.Get_len();
int *next=new int[len];
if(len>1)
Get_next(T,next);//求数组next值
else next[1]=0;
fgets(tp,MAXLEN,fp);
V.StringAssign(tp);
delete tp;//释放空间
for(i=0;i<num;i++)//替换各子串存在的T子串
{
int flag[MAXLEN]={1,};
flag[1]=Match(str[i],T,next,1);//找到替换位置
for(int j=flag[1]+T.Get_len(),k=2;j<=str[i].Get_len()&&k<=str[i].Get_len()+1;k++)
{//将主串中的所有T子串中替换掉
if(!flag[1])
{
cout<<flag[1]<<endl;
j=str[i].Get_len()+1;
}
else
{
Replace(str[i],V,flag[k-1]);
flag[k]=Match(str[i],T,next,j);
j=flag[k]+T.Get_len();
}
}
if (flag[1])
{
Replace(str[i],V,flag[k-1]);
str[i].print();
}
}
delete []str;
//delete []next;这个问题我不能解释
fclose(fp);
}
return 0;
}[em8][em10][em5][em5][em5][em5][em5][em5][em5][em5]