2011-09-29 54 views
0

我需要創建一個struct wordStruct保持一個字符串,並將其在文本文件中出現的次數的動態數組:我在使用它們之前是否需要初始化結構的值?

typedef struct wordStruct{ 
    char word[50]; 
    int count = 0; 
}wordStruct; 

我會得到我從文字閱讀的數量需要的數量該文件,我們稱之爲wordCount

struct wordStruct *wordList; 
wordList = (wordStruct *)malloc(wordCount * sizeof(wordStruct)); 

這是爲struct數組分配內存的正確方法嗎? calloc()會是更好的選擇嗎?

int wordListIndex = 0; 
char[50] inWord; // No word will be more than 49 characters + null terminator 
for (i = 0; i < wordCount; i++){ 
    fscanf(data, "%s", inWord); 
    for (j = 0; j < wordCount; j++){ 
    if (strcmp(wordList[j].word, inWord) == 0){ 
     wordList[j].count++; 
     break; 
    } 
    } 
    if (j == wordCount){ 
    strcpy(wordList[wordListIndex].word, inWord) 
    wordListIndex++; 
    } 

我知道這可能不是最有效的代碼,但我有正確的想法嗎?即使這些陣列位置中可能沒有任何數據,我可以使用strcmp()方法嗎?我是結構新手,我不確定我能做什麼,不能做什麼。

謝謝。

+0

如果你是typedef'ing它,爲什麼你使用struct來聲明一個wordStruct? –

+1

您的第一個結構聲明不是C代碼。它在這裏做什麼?其餘的代碼也充滿了怪異的聲明。 '字[50] inWord;' - 它是什麼? – AnT

+0

我是新的結構,我不確定正確的語法。 –

回答

1

如果您使用malloc,則需要初始化該數組(例如,使用memset)。如果您使用calloc,則陣列將初始化爲0。

一旦數組被初始化,您可以使用strcmp,因爲將其設置爲0會使所有字都是零長度(空)字符串。在初始化之前,您不能使用strcmp

(我假設怪異char[50] varname,而不是char varname[50]錯別字在SO問題,否則這將不會編譯。我也忽略了緩衝區溢出fscanfstrcpy ......嗯,從技術上來說,我想我」並且沒有錯誤處理)

+0

好吧,我把它切換到calloc()然後。什麼是fscanf的緩衝區溢出? –

+0

@MichaelSchilling:你所假設的人永遠不會發生 - 一個長於49個字符的單詞。你可以使用'%49s'來告訴'fscanf'最大長度。 – derobert

0

嵌套for循環應該使用wordListIndex作爲邊界條件,最後如果應該從block for循環中取出塊。條件應該應該是

if (j == wordListIndex){ 
    strcpy(wordList[wordListIndex].word, inWord) 
    wordListIndex++; 
} 
+0

我剛剛意識到那不應該是循環中的第二個int,而是第二個。現在解決。 –

相關問題