【发布时间】:2019-10-19 13:57:27
【问题描述】:
我正在使用 fgetc 并分隔单词来读取 UTF-8 格式的文本文件。我做了一个附加函数来将每个单词添加到一个链表中,但是当我打印出单词的地址时,它们都是相同的,表明它们只是被覆盖了。如何正确地将数据添加到我的列表中?
我还做了一个打印命令来遍历列表,虽然数据在我的附加函数中正确打印出来,但打印函数只是给出了一个垃圾值。
struct node
{
void *data;
struct node *next;
};
我将 def this 输入到linked_list
每当我得到一个新单词时,我都会在 main 中调用 append 函数。
void append(linked_list *list, void *word)
{
if(list->data == NULL)
{
list->data = word;
list->next = NULL;
//printf("WORD: %s\n", (char *)list->data);
//printf("ADDRESS %p\n", list->data);
}
else
{
linked_list *new_node;
new_node = malloc(sizeof(linked_list));
new_node->data = word;
new_node->next = NULL;
while(list->next != NULL)
{
if(list->next == NULL)
{
list->next = new_node;
}
}
//printf("WORD: %s\n", (char *)list->data);
//printf("ADDRESS %p\n", list->data);
}
}
这是我的打印功能
void print_list(linked_list *list) {
if(list == NULL)
{
printf("Print: the list is empty!\n");
}
while (list != NULL) {
printf("DATA %s\n", (char *)list->data);
list = list->next;
}
}
我希望打印功能可以打印
'DATA the_word' 用于所有单词,但我得到 'DATA �'
附加函数中的打印给出:
WORD: The
ADDRESS 0x55b6fa2314b0
WORD: Project
ADDRESS 0x55b6fa2314b0
WORD: Gutenberg
ADDRESS 0x55b6fa2314b0
WORD: EBook
ADDRESS 0x55b6fa2314b0
WORD: of
ADDRESS 0x55b6fa2314b0
WORD: Pride
ADDRESS 0x55b6fa2314b0
WORD: and
ADDRESS 0x55b6fa2314b0
WORD: Prejudice,
ADDRESS 0x55b6fa2314b0
WORD: by
ADDRESS 0x55b6fa2314b0
WORD: Jane
ADDRESS 0x55b6fa2314b0
WORD: Austen
ADDRESS 0x55b6fa2314b0
【问题讨论】:
-
“它们都是一样的”——是的,因为您可能将它们扫描到同一个缓冲区中,然后只存储该缓冲区的地址。您应该在存储字符串时对其进行复制。 (
strdup可能有用,但不是标准功能。) -
目前还不清楚这个程序是如何做任何事情的,因为
while(list->next != NULL)循环永远不会终止。
标签: c linked-list malloc