使用fgets和链表

时间:2014-06-25 17:42:31

标签: c linked-list fgets singly-linked-list

我正在尝试从fgets()获取用户输入并将该条目保存到链接列表中,但它不会将条目保存到链接列表中,但如果我直接将其放入调用中,则会这样做。恩。 add_to_list(&list, "hello");如何使用fgets保存到字符数组(称为word)中,我可以将其添加到add_to_list调用中?

    void
    add_to_list(struct linked_list *list, char *x)
    {
        struct node *n = malloc(sizeof *n);
        n->data = x;
        n->next = NULL;
        if (list->head == NULL)
            list->head = n;
        if (list->tail != NULL)
            list->tail->next = n;
        list->tail = n;
    }

    int
    main(void)
    {
        struct linked_list list = { .head = NULL, .tail = NULL };
        char word[50];

        do {
            printf("Enter string: ");
            fgets(word, 50, stdin)
            add_to_list(&list, word);
        } while (word[0] != '\n');

        //add_to_list(&list, "hello");
        print_list_rec(&list);
        free_list(&list);
        return 0;
    }

1 个答案:

答案 0 :(得分:1)

问题在于:

n->data = x;

此语句将指向缓冲区的指针分配给列表的data指针。但是,这是所有调用中的相同指针。此外,缓冲区位于自动存储中,因为word是局部变量。

为了解决此问题,您需要将字符串的复制添加到动态分配的缓冲区中。使用strlen来确定需要多少内存,strcpy来复制数据,并且在完成结构后不要忘记释放字符串。

size_t len = strlen(x);
n->data = malloc(len+1);
strcpy(n->data, x);

这里面是free_list

free(n->data);
free(n);