我正确使用这个动态数组吗?

时间:2011-09-15 21:09:45

标签: c file-io dynamic-arrays

我需要创建一个动态数组来保存我要从三个文件中读取的字符串。我是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;
}

3 个答案:

答案 0 :(得分:2)

  • 您不需要使用转换为calloc的返回值。 C语言指定类型void*的值与任何类型的指向对象的指针兼容。添加强制转换可能会隐藏不包括声明calloc的标头的错误。 在C ++中,规则是不同的。

  • 函数calloc()有两个参数:要分配的元素数量和每个元素的大小

    • 在第一个calloc中,您尝试分配奇怪大小的wordCount个元素。我喜欢将对象本身用作sizeof运算符
    • 的操作数
    • 在第二个calloc中,您尝试分配50个大小为50的元素。但是你只需要每个wordCount中有一个元素,对吗?根据定义,sizeof (char) 1也是char **wordList = calloc(wordCount, sizeof *wordlist); for (i = 0; i < wordCount; i++) { wordList[i] = calloc(1, stringLen); } 所以它不会为你买任何东西。

试试这个

{{1}}

答案 1 :(得分:0)

在sizeof()中,您必须使用您要分配的类型。指向char的指针与char本身不同,并且可能(在大多数情况下)具有不同的大小。例如:

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

此外,您不需要将指针的大小乘以字数,calloc已经为您执行了此操作。你也可以这样做:

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

答案 2 :(得分:0)

尝试使用链表数据结构。

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

这更适合您的需要。