一样的函数调用两次结果就不正确,求高手指点。
我定义了一个正则函数,我会在过程调用两次,全是如果调用两次的话,结果是不正确的,如果把我函数复制一下,函数名子改一下,这样就可以了,结果就是正确的,函数是一样。
下面是调用的函数:
- 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 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; // str.Replace("filename=",""); 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 去掉就试一下。