2011-09-15 58 views
1

我需要創建一個動態數組來存放我要從三個文件中讀取的字符串。我是C新手,並且我不太瞭解如何使用指針或分配內存。我想知道如果我正確地聲明我的陣列,並且我的calloc()調用是正確的。因爲我使用的文件格式爲:我正確使用這個動態數組嗎?

word1 
word2 
word3 (and so on) 

我只是假設從文件的話是超過50個字符(包括\0)不再。

最終我需要對它們進行排序,但在嘗試之前我需要將它們放入數組中。感謝您提供的任何幫助。


這裏是我迄今爲止...

#include <stdlib.h> 
#include <stdio.h> 

int countWords(FILE *f){ 
int count = 0; 
char ch; 
while ((ch = fgetc(f)) != EOF){ 
    if (ch == '\n') 
     count++; 
} 
return count; 
} 


int main(void){ 

int i; 
int wordCount = 0; 
int stringLen = 50; 

FILE *inFile; 

inFile = fopen("american0.txt", "r"); 
wordCount += countWords(inFile); 
fclose(inFile); 

inFile = fopen("american1.txt", "r"); 
wordCount += countWords(inFile); 
fclose(inFile); 

inFile = fopen("american2.txt", "r"); 
wordCount += countWords(inFile); 
fclose(inFile); 

printf("%d\n", wordCount); 


char **wordList = (char **) calloc(wordCount, wordCount * sizeof(char)); 
for (i = 0; i < wordCount; i++){ 
    wordList[i] = (char *) calloc(stringLen, stringLen * sizeof(char)); 
} 

char ch; 
int currentWord = 0; 
int currentWordIndex = 0; 
inFile = fopen("american0.txt", "r"); 
while ((ch = fgetc(inFile)) != EOF){ 
    if (ch == '\n'){ 
     currentWord++; 
     currentWordIndex = 0; 
    } 
    else 
     wordList[currentWord][currentWordIndex] = ch; 
} 
inFile = fopen("american1.txt", "r"); 
while ((ch = fgetc(inFile)) != EOF){ 
    if (ch == '\n'){ 
     currentWord++; 
     currentWordIndex = 0; 
    } 
    else 
     wordList[currentWord][currentWordIndex] = ch; 
} 
inFile = fopen("american2.txt", "r"); 
while ((ch = fgetc(inFile)) != EOF){ 
    if (ch == '\n'){ 
     currentWord++; 
     currentWordIndex = 0; 
    } 
    else 
     wordList[currentWord][currentWordIndex] = ch; 
} 

printf("%s\n", wordList[57]); 
for (i = 0; i < wordCount; i++){ 
    free(wordList[i]);} 

free(wordList); 
return 0; 
} 
+0

+1與源代碼的有用和清楚的問題。 – pmg

回答

2
  • 您不需要對calloc的返回值進行強制轉換。 C語言指定類型void*的值與任何類型的指向對象的指針兼容。添加演員表可能會隱藏不包括聲明calloc的標題的錯誤。 在C++中,規則是不同的。

  • 功能calloc()有兩個參數:元素的數量來分配和大小的每一個

    • 在第calloc你試圖分配一個奇怪的大小wordCount元素。我喜歡用物體本身在操作數的sizeof操作
    • 在第二calloc你試圖分配大小爲50每50個元素。但你只需要每個wordCount中的1個元素,對吧?另外,sizeof (char)的定義是,1,所以它不會買任何東西來乘以它。

嘗試這樣

char **wordList = calloc(wordCount, sizeof *wordlist); 
for (i = 0; i < wordCount; i++) { 
    wordList[i] = calloc(1, stringLen); 
} 
+0

我試過了,但是'printf(「%s \ n」,wordList [57]);'沒有給我充滿字符串(只是字母的'不在任何文件中)。這是嘗試打印出來的錯誤方式,還是我向數組添加新數據的方式錯誤? –

+0

您添加數據的方式是錯誤的:您需要在每個字符後增加'currentWordIndex'。一旦你完成這些文件,你也應該'fclose'文件。 – pmg

+0

呃!猜猜我錯過了。有用。十分感謝你的幫助! –

0

在的sizeof(),你必須使用你分配的類型。指向char的指針與char本身的類型不同,並且可能(並且在大多數情況下)具有不同的大小。例如:

char **wordList = (char **) calloc(wordCount, sizeof(char*)); 

而且,你不需要用這個詞數乘以指針的大小,釋放calloc已經這樣做,對你。您也可以這樣做:

char **wordList = (char **) malloc(wordCount * sizeof(char*)); 
0

嘗試使用鏈接列表數據結構。

樣品: http://www.macs.hw.ac.uk/~rjp/Coursewww/Cwww/linklist.html

這更好的適合您的需要。

+0

「最終我需要對它們進行排序」呢?對鏈表進行排序不適合初學者:) – pmg

+0

動態內存分配到dynamiclt增長數組中也不是初學者。 –

+0

沒錯,但他的陣列大小固定。在分配數組之前,他計算了大小......並且在完成時釋放了內存 – pmg