访问冲突读取位置0x00000006

时间:2013-07-17 15:35:57

标签: c++ visual-c++ c++11

我有以下代码,找到不包含字母的字符串。 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)

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

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

访问冲突错误通常是由NULL引用引起的。您正在调用的函数之一是尝试访问NULL指针。确保你的isdigit函数返回true或false,m_text指向一个退出的内存位置。如果不是,则需要分配内存。您还应该检查fileName是否为NULL。