fscanf以某种方式改变节点(在c中)

时间:2012-02-21 05:32:31

标签: c trie scanf

我是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);
    }
}

2 个答案:

答案 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再次分配内存。