递归函数有out_of_range异常

时间:2012-07-26 15:07:10

标签: c++ visual-studio-2008 recursion backtracking outofrangeexception

给定ASCII代码的全局向量list和相应的数字值以及字符串,如000.00-000.0.0.0,此函数使用input标记字符串2-char或3-char long将其替换为表示0到184之间的数字值的单个ASCII符号,然后将没有分隔符的缩短字符串作为out返回。此外,在给定ASCII符号的反向(方向1)中,它将转换回数字字符串并返回。

//looks for input string in vector and returns output, 'c' is check row, 'r' is return row
string vectorSearch(string &check, int n, int c, int r) 
{
    if (check.length() <= 1) 
        return check;
    if (list[n][c] == check || list[n][c] == ('0'+check)) //adds leading zero if 2char long
        return list[n][r];
    else 
        return vectorSearch (check, ++n, c, r);
}

//this function takes an ontology and either changes from single char 
//to string or takes strings and converts to char representation
string Lexicon::convertOntology(string input, int direction, string out, string temp) 
{
    if (input == "" && temp == "") 
        return out; //check for completed conversion
    else {
        if (input[0] == '.' || input[0] == '-' || input == "") { //found deliniator or endk
            if (input != "") return convertOntology(input.substr(1),direction, 
                 out+=vectorSearch(temp, 0, direction, 1-direction), "");
            else return convertOntology("", direction, 
                 out+=vectorSearch(temp, 0, direction, 1-direction), "");
        } else 
            return convertOntology(input.substr(1), direction, out, temp+=input[0]); //increment and check
    }
}

除了在解析最后一个char之后的输出之外,这些函数工作正常。如果在return convertOntology(input.substr(1), direction, out+=add, temp);input == ""上有一个中断,那么最后一次通过temp == "0"应该清除temp并将temp char添加到out字符串,因为temp是== 1char,那么它应该从vectorSearch()原样返回。然后清除vectorSearch()convertOntology()的{​​{1}}返回检查。但是,它永远不会在input的第一行达到中断,并且有一个

temp == ""

发生了什么事?这是一个通过返回回溯的问题,我错过了某个地方的返回来打破递归循环吗?

2 个答案:

答案 0 :(得分:2)

对于temp == ""input != ""您调用input.substr(1)的情况,这是超出范围的。

答案 1 :(得分:1)

即使你没有到达其他部分,

input.substr(1)
input字符串只有一个字符长时,

会抛出异常。

似乎它没有 - input.substr(input.size())被允许,并返回一个空字符串。


稍后您可能会在VectorSearch中遇到类似的问题。如果没有匹配项,您将增加n,直到超出范围。