我正在尝试将字典存储到名为spellingList的大型数组中。 fgets()循环似乎工作正常,但是当检查存储在spellingList中的内容时,它会显示数组的每个元素都是zygote(字典中的最后一个单词)。
给定名为 dictionary 的文件,其中包含以下格式的长词列表:
词典
barbecue
barbecue's
barbecued
barbecues
barbecuing
barbed
.
.
.
zwieback's
zygote
zygote's
zygotes
代码
int i = 0;
int j;
char *pos;
/* Open Dictionary */
FILE *dic;
dic = fopen("dictionary", "r");
/* Malloc Storage Array */
char **spellingList;
spellingList = malloc (sizeof(char*) * 100000);
if (spellingList == NULL){ // if malloc fails
printf("%s\n", "Malloc failure");
exit(0);
}
/* load dictionary into array */
while (1){
if (fgets (word, 50, dic) != NULL){
if ((pos=strchr(word, '\n')) != NULL){ // replace ending '\n' with a '\0'
*pos = '\0';
}
printf("%d %s\n", i, word ); // looks as expected
spellingList[i] = word;
i++;
}
else {
break;
}
} fclose(dic); // close fd to dictionary
for (j =0; j < 100; j++){ // output
printf("%d %s\n", j, spellingList[j]);
}
输出
.
.
.
90 zygotes
91 zygotes
92 zygotes
93 zygotes
94 zygotes
95 zygotes
96 zygotes
97 zygotes
98 zygotes
99 zygotes
答案 0 :(得分:0)
因为您正在存储指针值,然后更改指针指向的数据将有效地更改数组中的所有值。
你必须复制数据以避免这种情况,一种方法是
spellingList[i] = strdup(word);
换句话说,分配word
不会复制数据,它只会使spellingList[i]
指向word
的内存位置,因此所有元素都指向同一位置。
你必须阅读有关指针的更多信息。