2016-05-01 13 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にアクセスすると、配列の境界チェックがありません。渡された配列に十分なスペースが割り当てられていない場合は、配列の最後を過ぎて実行します。

以下に指摘したように、それは必ずしも問題ではありませんが、コードの残りの部分(メインなど)を見ずに言うのは不可能です。それは本当に悪いコードなので、配列の長さを知っているとは決して決して決してならないはずです。 C++を使用し、STLコンテナを使用しています。それは配列に関連付けられていた頭を悩ますことなく保存します。

+0

メインでこのような問題が実行されていませんか? const int SIZE = 5; \t文字列値[SIZE]; \t cout << lineParser( "1234 total TEST 5535 AEA"、値); – thegupmasta