2016-05-01 62 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

相關問題