-2

我有以下代码可以找到不包含字母的字符串。不应识别mynumber123之类的情况, numberFinder()应返回 false,应识别123之类的情况, numberFinder()应返回true以及数字的开始索引

构造函数:

CaddressParser::CaddressParser(string fileName)     //constructor
{
    m_fileName=fileName;
    int length=getLength(m_fileName.c_str());
    m_text =fileReader(m_fileName.c_str());
    m_length=length;
}

它初始化一个m_text包含文本文件内容的字符串

在实现的某个地方,我遇到了以下代码:

for (i;i<m_length;i++)
{
    bool UpperCaseBeforeNoFound=false;

    if(this->numberFinder (i).second)
    {
        //do some calculations.
    }
}

numberFinder 函数实现如下:

pair <int,bool> CaddressParser::numberFinder(int counter)
{
    bool noFound=isdigit(m_text[counter]);      //number found? -> true
    if(noFound)
    {
        int end=HouseNoDigits(counter);
        if(((counter-1)>=0) && ((counter +end-1) <m_length))
        {
            if((!(isalpha(m_text[counter-1]))) && (!isalpha(m_text[counter+end-1])))
            {
                return make_pair(counter,noFound);      //return index if true
            }
        }
     }
     else return make_pair(0,noFound);
 }

现在问题在于包含以下文本的文本文件“ he23 Market street London Q12 H13 ”。我收到标题中提到的错误,调试器将我带到其中包含的行:

if(this->numberFinder (i).second)

我无法弄清楚为什么会这样。请帮我弄清楚。

4

2 回答 2

3

如果此条件CaddressParser::numberFinder(int counter)失败:

if (counter - 1 >= 0 && counter + end - 1 < m_length)

该函数将退出而不返回值,从而导致未定义的行为。

糟糕的格式(至少在问题中发布)无助于函数中条件的复杂性。

您可能会通过删除获得所需的行为,else因此任何“失败”都将返回默认pair值(但这取决于您是否希望在该场景中真正返回该值):

pair <int,bool> CaddressParser::numberFinder(int counter)
{
    bool noFound=isdigit(m_text[counter]);      //number found? -> true
    if(noFound)
    {
        // ...
    }

    return make_pair(0,noFound);
}
于 2013-07-17T15:53:37.660 回答
0

访问冲突错误通常是由于 NULL 引用。您正在调用的函数之一是尝试访问 NULL 指针。确保您的 isdigit 函数返回 true 或 false,m_text 指向现有的内存位置。如果没有,您需要分配内存。您还应该检查文件名是否为 NULL。

于 2013-07-17T18:51:11.490 回答