以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 计算机考研交流 』   (http://bbs.xml.org.cn/list.asp?boardid=67)
----  求助---vc高手  (http://bbs.xml.org.cn/dispbbs.asp?boardid=67&rootid=&id=61904)


--  作者:mazheng23
--  发布时间:4/27/2008 9:19:00 PM

--  求助---vc高手
小弟做了个字符串匹配算法,可不管怎么调试都不能正常返回,希望大虾帮忙指正,先谢谢了


#include<string.h>
#include<iostream.h>
#include<stdlib.h>
#include<assert.h>
#include<stdio.h>

class string{//构造字符串类
private:
 char* str;//指向字符叔祖的指针
 int size;//数组长度
public:
 string(char* s);
 ~string();
 string& substr(string& s,int index,int count);

 string& operator=(string& s);
 void print();
 int *Next();
   
 friend bool Findpat(string,string,int);

};
string::string(char* s)//构造函数
{
 size=strlen(s);
 str=new char[size+1];
 strcpy(str,s);
}
string::~string()//析构函数
{
 delete[]str;
}

string& string::operator =(string& s)//‘=’符号重载用于对一个字符串类赋值
{
 if(size!=s.size)
 {
  delete []str;
  str=new char[s.size+1];
  size=s.size+1;
 }
 strcpy(str,s.str);
 return *this;
}
string& string::substr(string& s,int index,int count)//对一个字符串的实例取子串
{
 int i;
 int left=strlen(str)-index;
 char *p,*q;

 delete[]s.str;
 s.str=new char[count+1];
 p=s.str;
 q=&str[index];
   for(i=0;i<count;i++)
 {
     p[i]=q[i];
    
 }
 p[i]='\0';
 return s;
}
void string::print()//输出一个字符串实例
{
 cout<<str<<endl;
}

bool Findpat(string s,string p,int startindex)//字符串模式匹配算法,含通配符,S为目标串P为子串
{                                              //  ?可以匹配任意一字符,%可以匹配任意一子串
   int lastindex=strlen(s.str)-strlen(p.str);//计算目标串中最后可以匹配的位置
   int i=startindex;//接受匹配开始的位置
   cout<<lastindex<<endl;
   if((lastindex-i)<0)
    return -1;
   int j=0;//临时参数
   int start;
   start=i;
   string temp("");
   string s1("");
   string s2("");
   bool match;
   

   int m=strlen(s.str);//计算S的长度
   int n=strlen(p.str);//计算P的长度
   cout<<"m="<<m<<endl;//检测语句
   cout<<"n="<<n<<endl;
   cout<<"i="<<i<<endl;
   cout<<"j="<<j<<endl;
   cout<<"s.str[i]="<<s.str[i]<<endl;
   cout<<"p.str[j]="<<p.str[j]<<endl;
   while(i<m&&j<n)//开始匹配
   {
    if(s.str[i]==p.str[j])
    {
     i++;
     j++;
    }
  else if(p.str[j]=='?')//如果子串中为此通配符,则目标串,子串指针均后移一个字符
    {
     i++;
     j++;
     //continue;
    }
   else if(p.str[j]=='%')//如果子串中为此通配符,则采用递归
    {
     j++;           //子串跳过此通配符
     s1=s.substr(temp,i,m-i);//取目标串的剩余子串
        cout<<"jiancechengxu"<<endl;//检测语句
     s1.print();
     s2=p.substr(temp,j,n-j);//取子串剩余子串
     cout<<"jiancechengxu"<<endl;//检测语句
     s2.print();
     cout<<"zhun bei jin xing zi pipei"<<endl;
     match=Findpat(s1,s2,0);//调用此方法,进行递归匹配
     if(match)              //(问题,这里的match没有接受到此方法的返回值,我却找不出原因)
     {
      cout<<"匹配成功!1"<<endl;
     
         return true;
     }
     else
      return false;
    
   }
    else//如果s.str[i]!=p.str[j],则回溯
    {
     i=i-j+1;
     start=i;
     j=0;
    }
   }
   if(j>=n)
   {  
    cout<<"匹配成功!2!!!"<<endl;
    
    return true;
   
   }
   else
   {   cout<<"error!"<<endl;
       
    return false;
   }
}
int main()
{
 string p1("B8 64 42 rt 56 fc cv bh hy B4 40 bn nj B8 mn 57");
 cout<<"p1:";
 p1.print();
 string p2("B8 ?? 42 ?? ?? ?? ?? % B4 40 % B8 ?? 57");
 cout<<"p2:";
 p2.print();
    


    cout<<"没有错误"<<endl;
    bool a=Findpat(p1,p2,0);
  

    if(a)
 {
  cout<<"匹配成功!3"<<endl;//检测语句
    
 }
 else
  cout<<"没有匹配成功!"<<endl;


 return 0;
}


--  作者:dq85
--  发布时间:4/27/2008 11:07:00 PM

--  
Findpat函数中只创建了一个temp,你两个s1=s.substr(temp,i,m-i);和s2=p.substr(temp,j,n-j);都调用它,但是s.substr中存在delete []str;,那第二次时当然无法DELETE了,第一次已经释放空间了嘛
另外小问题就是  if((lastindex-i)<0)    return -1;,BOOL返回了-1

--  作者:mazheng23
--  发布时间:4/28/2008 9:27:00 AM

--  
大牛,我仔细又看了看确实是这样内存方面出的问题,可我改了之后还是不能正常返回啊,都快郁闷死我了,谢谢你的关注啊
--  作者:dq85
--  发布时间:4/28/2008 10:56:00 AM

--  
你怎么改的啊,substr函数其实只用2个参数就可以了啊,我都在电脑上编译运行通过了啊,不过只是通过你给的字符串,别的没试
--  作者:dq85
--  发布时间:4/28/2008 10:59:00 AM

--  
string& string::substr(int index,int count)//对一个字符串的实例取子串
{
int i;
int left=strlen(str)-index;
char *p,*q;
string s;
delete[]s.str;
s.str=new char[count+1];
p=s.str;
q=&str[index];
   for(i=0;i<count;i++)
{
     p[i]=q[i];
    
}
p[i]='\0';
return s;
}

类函数声明和调用时函数参数个数也要改


--  作者:mazheng23
--  发布时间:4/28/2008 11:07:00 AM

--  
大哥,我是不是太笨了,按你的说法改了,还是有错,我程序的BUG太多了,好象都是内存管理方面的,要不我加你Q行不
--  作者:dq85
--  发布时间:4/28/2008 11:11:00 AM

--  
38976893
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms