我有以下代码,找到不包含字母的字符串。 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)
我无法弄清楚为什么会这样。请帮我搞清楚。
答案 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。