求助 VC++ 基于关键词的文本过滤

各位大侠:

 最近在做这个课程设计。。。。 表示压力很大 ,,,, 目前做的初级阶段的时候 主要应用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
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值