libc ++ abi.dylib:以std :: out_of_range类型的未捕获异常终止:basic_string错误?

时间:2016-05-01 01:17:33

标签: c++

这是一个我写的函数,它接收一个由空格分隔的单词串,并将每个单词添加到一个数组中。我一直收到错误,上面写着" libc ++ abi.dylib:以std :: out_of_range:basic_string类型的未捕获异常终止。"我似乎无法找到错误。

void lineParser(string line, string words[])
{
    string word = "";
    int array_index = 0;
    int number_of_words = 1;
    int string_index = 0;
    while (string_index < line.length())
    {
        if (line.substr(string_index,1) != " ")
        {
            int j = string_index;
            while (line.substr(j,1) != " ")
            {
                word += line.substr(j,1);
                j++;
            }
            words[array_index] = word;
            array_index++;
            word = "";
            number_of_words++;
            string_index = j;
        }
        else
        {
            string_index++;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

访问words时,您没有检查数组边界。如果传入的数组没有分配足够的空间,那么你将超越数组的末尾。

正如您在下面指出的那样,这不一定是问题所在,但如果没有看到其他代码(例如主要代码),则无法说出来。它也是非常糟糕的代码,你永远不应该假设你知道数组的长度。您正在使用C ++,使用STL容器。它将为您节省与数组相关的令人头疼的问题。

答案 1 :(得分:1)

允许您的变量j增加而不进行边界检查。它最终将超出您使用它作为(.line.substr(j,1))索引的字符串的长度。

一个非常糟糕的答案是在搜索line个字符之前在字符串' '的末尾添加一个空格。一个更好的答案是在调用任何使用它作为索引来访问字符串中字符的函数之前,检查j与字符串的长度。