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

最佳答案

返回值calloc不需要强制转换。C语言指定void*类型的值与指向对象的任何类型的指针兼容。添加强制转换可能会隐藏声明calloc时不包含头的错误。在C++中,规则是不同的。
函数有两个参数:要分配的元素数和每个元素的大小
在第一个calloc()中,您试图分配一个奇怪大小的calloc元素。我喜欢使用对象本身作为wordCount运算符的操作数
在第二个sizeof中,您试图分配50个大小为50的元素。但每个calloc中只需要一个元素,对吗?同时,根据定义,wordCount也就是说,它不会给你买任何东西来乘以它。
像这样试试

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

关于c - 我是否正确使用此动态数组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7437478/

10-12 05:11