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