2016-08-14 116 views
-1

我一直在這裏待了幾個小時,而且我很難讀入我的文本文件,計算每個單詞有多少個字母,每個字的數量字母。將word.length()存儲並輸出到數組中

我已經提出了這個問題,迄今:

#include <iostream> 
#include <iomanip> 
#include <cmath> 
#include <string> 
#include <fstream> 

using namespace std; 

const int array_size = 29; 

int main() { 

ifstream inputfile; 
string word, word2; 
int wordlength[array_size]; 
int length = 0; 

cout << left << setw(10) << "Length: "; 
cout << left << setw(10) << "# of words: " << endl; 

inputfile.open("C:/EnglishWords.txt"); 

while (inputfile) { 

    inputfile >> word; 

    int len = word.length(); 
    wordlength[len]++; //initialized array for '29' 

    for (int i = 1; i < 29; i++) { 
     cout << left << setw(10) << wordlength[i]; 
     cout << left << setw(10) << i; 
    } 
} 

getchar(); 
getchar(); 

return 0; 
} 

我基本上得到的-8293729變化(我假定這是垃圾存儲器),選擇那些我要打印的每個實際值。我真的可以使用這個stackoverflow的力量,因爲我很難過:/。

編輯:我正在閱讀的文件是由「/」分隔的所有英文單詞的列表;

+0

除了嵌套'for'循環(哦,這是一個缺少'}'?感謝[MCVE]),並檢查流錯誤** **之前提取,你沒有向我們顯示錯誤。 'wordlength'可能有未初始化的元素。它應該是'std :: map' ... – LogicStuff

+0

嘿,謝謝你的迴應。我在while循環結尾添加了'}'。所以這不是問題。我有點困惑,因爲我會告訴你錯誤,通過提供int main()部分,所以你可以編譯它?另外,我是編碼方面的新手,對於如何實現地圖我有點困惑,我查了一下,但仍然有點失落。再次感謝您的迴應! – Complexicator

+0

這個'while'循環可能應該是'while(inputFile >> word){...}' – KABoissonneault

回答

1

首先,您的wordlentgth數組未初始化。 嘗試在遞增之前使用for循環將其內容設置爲0。或者,更好的是,使用memset

int wordlength[array_size]; 
memset(wordlength, 0, array_size); 

編輯:int wordlength[array_size] = {0};在這種情況下要走的路。例如,當您不得不重新設置數組時,memset非常有用。

您需要編輯#include <cstring>才能使用它。其次,如果任何單詞大於array_size,則由於分段錯誤(您應該查看它,如果使用C/C++編程,將會遇到最常見的錯誤),您的程序將崩潰。爲了避免這種錯誤,只要確保len是通過在包裝是否增量遞增wordlength[len]比前array_size較小:

int len = word.length(); 
if(len < array_size) { 
    wordlength[len]++; 
} else { 
    cerr << "A word was ignored because it was too long: \"" << word << "\"\n"; 
} 

最後,你應該讀一點關於命名約定。這確實是一個偏好問題,但試圖保持一致(即wordlength不遵循與array_size相同的約定)。你寫array_size的方式叫做snake-case,我個人喜歡,但C語言家族的主流風格是CamelCase。 關於風格的另一個注意事項是:ok使用全局常量,但是確實建議將其命名爲清楚,因爲它是一個常量:ARRAY_SIZE而不是array_size

此外,請正確縮進您的代碼。更好的是,使用可以自動縮進代碼的編輯器。

+0

真心感謝所有的建議人。我使用Visual Studio並保持格式化,但是當我將代碼粘貼到框中時,我必須將它縮進4個空格,並將所有內容混淆。我一定會讀到所有這些東西。謝謝! 我打算給初始化一個嘗試,看看會發生什麼,而且,我會嘗試將'len'設置爲0以使其'小於'數組大小? 我很感激幫助! – Complexicator

+0

是不是初始化'wordlength'就足以將它初始化爲0?例如:'int wordlength [array_size] {}'或'int wordlength [array_size] = {0}'? – KABoissonneault

+0

@KABoissonneault你完全正確,我忘了那個,傻我 – fstamour

0

我只是想澄清,我通過初始化我的數組解決了我的問題。

我說:

int wordlength[array_size] = {0}; 

到我的文件的頂部和轉儲內存不再輸出。

感謝所有幫助:)