我正在尝试从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;
}
答案 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);