2016-04-27 227 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方法,旨在解決這個問題,同時避免重複工作,對象和內存碎片的毫無意義的複製。

相關問題