2016-04-27 42 views
-2

私はまだC++でかなり新しいです。このループを作成して、.csvファイルにある30,000の配列にインポートされた長いツイートのリストを調べます。 HashAll関数を使用して各ツイートを調べ、#がある場所を見つけて新しい文字列にコピーし、新しい文字列を新しい配列に入れて、使用されるハッシュタグを収集します。問題は、コードをテストするたびにコアダンプが発生し、その理由を理解できないことです。以下は私のコードです。何か助けてくれてありがとう!forループ全体の配列を繰り返さない

void AllTweets::HashAll(){ 
    int counter=0; 
    for(int i=0; i<30000;i++){ //loop to looks are every tweet indv. 
      string singleTweet = Tweet[i]; 
      int x = singleTweet.length(); 
     for(int j=0;j<x;j++){ 
      string newHash; 
      if(singleTweet[j]=='#') { 
        int k=j; 
       while(singleTweet[k]!=' '){ 
        newHash=newHash+singleTweet[k]; 
        k=k+1; 
       } 
       HashtagAll[counter]=newHash; 
       counter=counter+1; 
      } 
     } 
    } 
+0

私の注意を忘れてしまいました。 – Chris

+0

ハッシュタグがツイートの最後にある場合は、その後ろにスペースがない可能性があります。 – stark

答えて

1

問題は、あなたが常にハッシュタグの単語の後にスペースを見つけて、while()ループ内での検索中に、あなたは文字列の大きさを推定していないかどうかをテストしないように期待していることであるように見えます。

簡単な解決策は、ループ内でそのテストを含めることであろう。

while (singleTweet[k] != ' ' && k < x) 
{ 
    newHash = newHash + singleTweet[k]; 
    k++; 
} 

私はこのコードを再検討する必要があることを促すしかし、目を満たしているよりも、ここで起こって多くのものがあります。 newHashを1文字ずつ増やすたびに、新しいサイズに合わせることができるメモリ内の新しいスペースに強制的に移動し、不必要で時間のかかる作業を行い、場所を問わずメモリを断片化しますC++での文字列の操作方法

クラスstd::stringは単なる自己サイズ変更用バッファではなく、コード目的と生活をより簡単にするために作成されたテキストと文字列を処理するさまざまな方法を提供しています。たとえば、あなたの方法は、よりこのように書き換えすることができます

void AllTweets::HashAll() 
{ 
    size_t counter = 0; 
    for (size_t i = 0; i < 30000; ++i) 
    { 
     size_t find = 0; 
     while ((find = Tweet[i].find("#", find)) != std::string::npos) 
     { 
      size_t end = Tweet[i].find(" ", find + 1); 
      if (end == std::string::npos) 
      { 
       HashtagAll[counter++] = Tweet[i].substr(find); 
       break; 
      } 

      HashtagAll[counter++] = Tweet[i].substr(find, end - find); 
      find = end + 1; 
     } 
    } 
} 

このコードは冗長な作業を回避しながら、この問題に対処するために設計さstd::string方法、オブジェクトとメモリの断片化の無意味なコピーを使用しています。

関連する問題