我是c的新手,并且已经坚持了几个小时。我的代码从txt文件中读取每个单词,然后将该单词存储在trie中的节点中。
我已将问题缩小到星号标记的区域:
在那一点上,我已经成功地将第一个单词添加到trie,并检查正确的节点的值是否与单词匹配。然后,我使用fscanf
将下一个单词保存为char'add'。然后,打印出与以前完全相同的东西,节点的单词应该保持不变。但是,它已经以某种方式被更改为刚刚从文件中读取的新单词。
这怎么可能?
int main(int argc, char** argv) {
trie_t* trie = malloc(sizeof(trie_t));
trie_init(trie);
int ret;
char* add = malloc(128);
FILE* file = fopen(argv[5], "r");
if (file == NULL) {
/* Failed to open the file for reading */
return 0;
}
while (1) {*********************
if (trie->head->children != NULL) {
printf("%s\n", trie->head->children->word);
}
ret = fscanf(file, "%s", add);
//printf("word = %s\n",toAdd);
if (trie->head->children != NULL) {
printf("%s\n", trie->head->children->word);
}****************************
if (ret == EOF) {
/* End of file */
ret = 1;
break;
} else if (ret <= 0) {
printf("fails");
/* Failed to read a word from the file */
break;
} else {
printf("gets here\n");
/* Succesfully read a word */
int x = trie_add(trie, add);
printf("%d\n",x);
}
}
答案 0 :(得分:2)
您只需为add
分配一次内存:
char* add = malloc(128);
您需要为每个单词分配内存,也就是说,您需要将malloc
移动到您的阅读周期。
代码在发布时所做的是:分配128个字节一次,然后每次scanf()
一次又一次覆盖该内存空间。
此外,在char* add = malloc(128);
,您应将其指定为char* add = malloc(128 * sizeof(char));
,以便清晰易用:)
答案 1 :(得分:1)
我假设您将指针add
存储在trie_t
函数的trie_add
中。在这种情况下,由于您正在重用相同的内存位置add
来读取下一个字符串,因此add
指向的指针内容会发生变化。由于您只是将此指针存储在trie
中,因此该节点的内容也会发生变化。要解决此问题,您需要在使用malloc
从文件中读取新字符串之前使用fscanf
再次分配内存。