1

我在这里真的很近。

这会读取文件并使用 gdb 我可以看到文本文件中的单词进入链接列表。

但是,当我打印我的链表(代码的底部)时,整个链表似乎只包含文件中的最后一个单词,因为文件中有很多条目。

bool load(const char* dictionary) {
    // open dictionary
    FILE* file = fopen(dictionary, "r");
    if (file == NULL)
        return false;

    char buf[LENGTH];

    //read the contents of the file and write to linked list
    while (!feof(file)) {
        fscanf(file,"%s", buf);

        // try to instantiate node
        node* newptr = malloc(sizeof(node));
        if (newptr == NULL) {
            return false;
        }

        // initialize node
        newptr->next = NULL;

        // add new word to linked list
        newptr->dictword = buf;

        //move node to start of linked list
        newptr->next = first;
        first = newptr;
    }

    fclose(file); 

    // traverse and print list.
    node* ptr = first;
    while (ptr != NULL) {
        printf("%s\n", ptr->dictword);
        ptr = ptr->next;
    }

    return true;
}
4

5 回答 5

1

您只有一个char buf[]可以阅读每个单词的内容。您在每个链表元素中保存一个指向该缓冲区的指针,但您会立即读取数据。当你把它放入分配的node. 最简单的方法是使用newptr->dictword = strdup(buf)which 一步完成分配和复制。

于 2013-02-27T23:16:54.240 回答
0

使用 feof 表示您是 1. 不使用 unix 环境并且必须适应 mingw 无法在标准输入中正确 eof。2. 想太多,实际上应该检查eof。

我通常这样做:

void* collection = ...;
FILE* filebehere = ...;
char buffer[1337];
while (fgets(buffer, 1337, filebehere)) {
    if (strlen(buffer) != 0) {
        buffer[strlen(buffer) - 1] = 0;
        collection_insert(collection, buffer);
    }
}
于 2013-02-27T23:25:39.263 回答
0

线路有问题:

// add new word to linked list
newptr->dictword = buf;

通过这种方式,您总是将对 buf 开头的引用传递给所有元素,因此当您更新“buf”时,所有元素都会更新。这就是为什么你有提到的行为。

尝试将其替换为:

newptr->dictword = (char*) malloc((strlen(buf)+1)*sizeof(char));
strcpy(newptr->dictword, buf);

“strlen(buf)+1”是存储在 buf 中的当前字符串的长度加上字符“\0”的空格,表示字符串的结尾。

PS。假设您已经用 char* 声明了元素“dictword”。

于 2013-02-27T23:28:37.470 回答
0

假设dictword的大小LENGTH与您的buf一样,即:

struct node {
...
...
    char dictword[LENGTH];
...
...
};

您需要在代码中进行以下更改:

strcpy(newptr->dictword, buf);

问题是您只是将字典设置为指向与链表所有节点中的 buf 相同的内存。

更好的方法是为字符串动态分配内存:

struct node {
...
...
    char* dictword;
...
...
};

newptr->dictword = (char*)malloc(strlen(buf) + 1);
strcpy(newptr->dictword, buf);
于 2013-02-27T23:18:16.537 回答
0

我推荐strdupBenJackson 的解决方案。但它不存在于标准 C 库中。

这是我的解决方法:

char *strdup(const char *data)
{
   char *retval = malloc(strlen(data) + 1);
   strcpy(retval, data);
   return retval;
}
于 2013-02-27T23:19:02.303 回答