【问题标题】:libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: basic_string Error?libc++abi.dylib:以 std::out_of_range 类型的未捕获异常终止:basic_string 错误?
【发布时间】:2016-05-01 01:17:32
【问题描述】:

这是我正在编写的一个函数,它接收由空格分隔的一串单词并将每个单词添加到一个数组中。我不断收到一条错误消息,提示“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++;
        }
    }
}

【问题讨论】:

  • 您应该将一个可调整大小的容器(如 std::vector)的引用传递给您的函数,而不是数组指针。

标签: c++


【解决方案1】:

您的变量j 也可以在没有边界检查的情况下增加。它最终会超过您将其用作 (.line.substr(j,1)) 的索引的字符串的长度。

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

【讨论】:

  • 啊,我明白了。非常感谢!
  • 抱歉,我是这个网站的新手。我现在已将您的答案设置为正确。
【解决方案2】:

访问words 时没有数组边界检查。如果传入的数组没有分配足够的空间,你会跑到数组的末尾。

正如您在下面指出的那样,这不一定是问题所在,但是如果不查看其余代码(例如 main),就不可能说出来。这也是非常糟糕的代码,你永远不应该假设你知道数组的长度。您正在使用 C++,使用 STL 容器。它将为您省去与数组相关的无数麻烦。

【讨论】:

  • 那么这个问题在 main 中的执行中没有解决吗?常量 int 大小 = 5;字符串值[大小]; cout
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
相关资源
最近更新 更多