这是我的代码。
#include <stdlib.h>
#include <stdio.h>
int main() {
//Vars
FILE *fp;
char word[9999],
*arrayOfWords[9999];
int wordCount = 0, i;
//Actions
fp = fopen("data.txt", "r");
if(fp != NULL) {
while(!feof(fp)) {
fscanf(fp, "%s", word);
arrayOfWords[wordCount] = word;
wordCount++;
}
for(i = 0; i < wordCount; i++) {
printf("%s n", arrayOfWords[i]);
}
puts("");
} else {
puts("Cannot read the file!");
}
return 0;
}
我正在尝试从一个文本文件中读取一些数据,并将其存储到一个数组中。当我在循环中时,一切都很好,但当我离开循环时,数组中任何索引的任何值都会填充文件的最后一个字。有人能帮我找出我正在犯的错误吗?
数据文件:
Hello there, this is a new file.
结果:
file.
file.
file.
file.
file.
file.
file.
file.
任何帮助都将不胜感激!
您需要为数组的每个单独成员分配内存(使用malloc或通过给出数组的第二个维度并声明其类型为char
而不是char*
)。你所做的类似于:
char *s;
scanf("%s", s);
而这在C
中不起作用。事实上,这里有UB(未定义的行为),因为指针没有初始化。
EDIT:你让数组中的所有字段都指向你的数组word
,一旦你读了单词,你就应该为字符串分配新的内存,然后为它分配strcpy
word
。
您的代码中至少有两个关注点。char word[9999], *arrayOfWords[9999];
将arrayOfWords
定义为9999个char pointers
的数组。这是一个令人关切的问题。
另一点是CCD_ 10。这里要存储新读取的字,需要分配空间,因为arrayOfWords
是指针数组。请在下面找到您修改后的代码。
int main() {
//Vars
FILE *fp;
char arrayOfWords[30];
int wordCount = 0, i;
//Actions
fp = fopen("data.txt", "r");
if(fp != NULL) {
while(!feof(fp)) {
fscanf(fp, "%s", &arrayOfWords[wordCount]);
wordCount++;
}
puts("");
for(i = 0; i < (wordCount - 1); i++) {
puts(arrayOfWords[i]);
}
puts("");
} else {
puts("Cannot read the file!");
}
return 0;
}
这:
arrayOfWords[wordCount] = word;
不将当前字复制到单独的存储器中,它只是分配另一个指针指向与word
相同的存储器。因此,您最终得到一个指向同一word
数组的指针数组。您需要为每个单词单独分配内存,并复制组成每个单词的字符(以及NULL终止符),而不是指针。