同一个函数调用两次,结果不正确,如果把函数复制一个,改一下函数名,在调用,结果是正确的。求解决办法
同一个函数调用两次,结果不正确,如果把函数复制一个,改一下函数名,在调用,结果是正确的。求解决方法。
我定义了一个正则函数,我会在过程调用两次,全是如果调用两次的话,结果是不正确的,如果把我函数复制一下,函数名子改一下,这样就可以了,结果就是正确的,函数是一样。
下面是调用的函数:
这里调用的地方:
奇怪的问题是如果我把函数复制一下,把函数名称修改一下,在调用就是正确的。
下面是显示结果正确的:
求解决方法。
------解决方案--------------------
static CRegexpT <char> regexp(StrReg);
应该是这句的差距,两次调用同一个函数,如果函数体类有 static变量的话,这个变量只是在第一次调用的时候才会被初始化,当你第一次调用完成后,如果regexp静态对象的数据没有被正确的清除,就可能对第二次调用产生影响
你下面的调用同一个函数实现,但是不同的函数名,就是两个不同的static CRegexpT <char> regexp(StrReg);
两次调用不会相互影响,所以你的结果正确
这个也验证了是regexp静态对象的影响出现了你说的问题
我定义了一个正则函数,我会在过程调用两次,全是如果调用两次的话,结果是不正确的,如果把我函数复制一下,函数名子改一下,这样就可以了,结果就是正确的,函数是一样。
下面是调用的函数:
- C/C++ code
CString AntBaiduDir(char *chArray,char *StrReg,CString & AntSum) { //正则匹配 char * text = chArray; CString str,RegStr; static CRegexpT <char> regexp(StrReg); MatchResult result = regexp.Match(text); while(result.IsMatched()) { int sum=result.GetEnd() - result.GetStart(); RegStr=text + result.GetStart(); str=RegStr.Left(sum); AntSum+=str; result = regexp.Match(text, result.GetEnd()); } return AntSum; }
这里调用的地方:
- C/C++ code
//转换编码 CString m_str2_,test1; GetDlgItem(IDC_EDIT1)->GetWindowText(m_str2_); //第一次正则匹配 CString AntSum; char *StrReg1="path(.*?)ifhassubdir"; AntBaiduDir(CharCov(m_str2_),StrReg1,AntSum); //第一次调用 char *StrReg2="path\\\\\":\\\\\"(\\d+:/[^\\\\]*?)\\"; AntBaiduDir(CharCov(AntSum),StrReg2,test1); //第二次调用 m_str2.SetWindowText(test1);
奇怪的问题是如果我把函数复制一下,把函数名称修改一下,在调用就是正确的。
下面是显示结果正确的:
- C/C++ code
CString AntBaiduDir(char *chArray,char *StrReg,CString & AntSum) { //正则匹配 char * text = chArray; CString str,RegStr; static CRegexpT <char> regexp(StrReg); MatchResult result = regexp.Match(text); while(result.IsMatched()) { int sum=result.GetEnd() - result.GetStart(); RegStr=text + result.GetStart(); str=RegStr.Left(sum); AntSum+=str; // str.Replace("filename=",""); result = regexp.Match(text, result.GetEnd()); } return AntSum; }
- C/C++ code
CString AntBaidu(char *chArray,char *StrReg,CString & AntSum) { //正则匹配 char * text = chArray; CString str,RegStr; static CRegexpT <char> regexp(StrReg); MatchResult result = regexp.Match(text); while(result.IsMatched()) { int sum=result.GetEnd() - result.GetStart(); RegStr=text + result.GetStart(); str=RegStr.Left(sum); AntSum+=str; result = regexp.Match(text, result.GetEnd()); } return AntSum; }
- C/C++ code
//转换编码 CString m_str2_,test1; GetDlgItem(IDC_EDIT1)->GetWindowText(m_str2_); //第一次正则匹配 CString AntSum; char *StrReg1="path(.*?)ifhassubdir"; AntBaiduDir(CharCov(m_str2_),StrReg1,AntSum); //第一次调用 char *StrReg2="path\\\\\":\\\\\"(\\d+:/[^\\\\]*?)\\"; AntBaidu(CharCov(AntSum),StrReg2,test1); //第二次调用 m_str2.SetWindowText(test1);
求解决方法。
------解决方案--------------------
static CRegexpT <char> regexp(StrReg);
应该是这句的差距,两次调用同一个函数,如果函数体类有 static变量的话,这个变量只是在第一次调用的时候才会被初始化,当你第一次调用完成后,如果regexp静态对象的数据没有被正确的清除,就可能对第二次调用产生影响
你下面的调用同一个函数实现,但是不同的函数名,就是两个不同的static CRegexpT <char> regexp(StrReg);
两次调用不会相互影响,所以你的结果正确
这个也验证了是regexp静态对象的影响出现了你说的问题