各位大侠:
最近在做这个课程设计。。。。 表示压力很大 ,,,, 目前做的初级阶段的时候 主要应用KMP算法进行 匹配查找 ,算法在DOS下测试成功 只能找出第一个匹配的索引位置 ,,,转到MFC中的时候 想把编辑框第一行的匹配成功的关键字给替换掉,代码编辑连接时没有提示错误但是运行的时候出现了错误 请各位大侠 帮忙看一下代码 !! 跪求指导! 如果有做过这方面的 程序的 请联系我QQ919416297重谢!
void CFILTERDlg::OnSearch() //查询按钮
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);//将输入的关键字赋值给编辑框
CString strtemp1=m_keywords; //将编辑框的字符串赋值给变量
int s_len=strtemp1.GetLength(); // 模式串长度
char *Pattern=new char[s_len+1];
for(int i=0;i<=s_len;i++)
{
Pattern[i]=strtemp1.GetAt(i);
}
int lineC=m_display.GetLineCount();//获取编辑框内容的行数
int len1=m_display.LineLength(1);//获取第一行的长度
char *Text=new char[len1+1]; //动态分配第一行长度大小的内存
m_display.GetLine(1,Text);//获取第一行的字符串
int m=KMP( Text,Pattern );//调用KMP算法模式匹配
if(m==-1)
{
MessageBox("查找不到");
}
else
{
m_display.SetSel(m,s_len,FALSE);
m_display.ReplaceSel("*",TRUE);
}
void CFILTERDlg::getNext( char *pattern, int next[])
{
next[0]=-1; //初始化定义任意模式串的第一个字符的函数值为-1
int k=-1,j=0;
while(pattern[j]!='/0') //从模式串第一个字符开始计算,直到结束
{
if(k!=-1&&pattern[k]!=pattern[j])
k=next[k];
++j;++k;
if(pattern[k]== pattern[j]) //如果前后两个字符相同
next[j]=next[k];
else
next[j]=k; //模式串前面K个字符和模式串从J往前的K歌字符相同的情况
}
}
int CFILTERDlg::KMP( char *Text, char *Pattern)
{
if( !Text||!Pattern|| Pattern[0]=='/0' || Text[0]=='/0' )
return -1;//空指针或者主串和模式串为空串的时候,返回-1。
int len=0; //模式串的长度
char * c=Pattern; //定义指向模式串的指针
while(*c++!='/0')//从模式串第一个字符开始判断,记录模式串的长度
{
++len;//模式串的长度。
}
int *next=new int[len+1];//动态分配一个和模式串长度同样大小的内存空间
getNext(Pattern,next);//调用求模式串的每个字符的next函数值
int index=0,i=0,j=0;
while(Text[i]!='/0' && Pattern[j]!='/0' ) //从第一个字符开始直到主串和模式串有一个结束为止
{
if(Text[i]== Pattern[j]) // 如果某一个字符匹配成功则继续比较后续字符
{
++i;
++j;
}
else
{
index += j-next[j];
if(next[j]!=-1)
j=next[j];// 模式串向右移动
else
{
j=0;
++i;
}
}
}
delete []next; // 删除动态分配的内存空间
if(Pattern[j]=='/0') //直到将模式串中的所有字符匹配完
return index;// 匹配成功,则返回模式串第一个字符在主串中的索引位置
else
return -1; //匹配失败 ,则返回-1
}