读书人

一样的函数调用两次结果就不正确求

发布时间: 2012-05-21 18:04:41 作者: rapoo

一样的函数调用两次结果就不正确,求高手指点。
我定义了一个正则函数,我会在过程调用两次,全是如果调用两次的话,结果是不正确的,如果把我函数复制一下,函数名子改一下,这样就可以了,结果就是正确的,函数是一样。

下面是调用的函数:

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 去掉就试一下。

读书人网 >C++

热点推荐