2016-05-01 63 views
0

这是我正在写的一个函数,它接收一串由空格分隔的单词,并将每个单词添加到数组中。我不断收到一个错误,指出“libC++ abi.dylib:以std :: out_of_range:basic_string类型的未捕获异常终止。”我似乎无法找到错误。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++; 
     } 
    } 
} 
+1

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

回答

1

您的变量j也被允许增加而无边界检查。它最终会超过你使用它作为索引的字符串的长度(.line.substr(j,1))。

一个非常不好的答案是在搜索' '字符之前在字符串line的末尾添加一个空格。一个更好的答案是在调用任何访问字符串中的字符的函数之前,根据字符串的长度检查j。

+0

啊,我明白了。非常感谢你! – thegupmasta

+0

如果这解决了您的问题,请将我的答案标记为已接受/正确。 – Jfevold

+0

对不起,我是这个网站的新手。我现在把你的答案设定为正确。 – thegupmasta

1

访问words时,您没有数组边界检查。如果传入的数组没有足够的空间分配,您将运行超过数组的末尾。正如你在下面指出的那样,这不一定是问题,但是如果没有看到其他代码(例如main),就不可能说出来。这也是非常糟糕的代码,你永远不应该假设你知道数组的长度。你正在使用C++,利用STL容器。它将为您节省数不清的与阵列相关的头痛。

+0

那么这个执行在main中是不是涉及这个问题呢? const int SIZE = 5; \t字符串值[SIZE]; \t cout << lineParser(“1234 total TEST 5535 AEA”,values); – thegupmasta

相关问题