gpt4 book ai didi

c - 从文件读取到链接列表时出现问题

转载 作者:行者123 更新时间:2023-11-30 14:39:39 25 4
gpt4 key购买 nike

我正在尝试创建一个函数,从文本文件中读取 child 的名字并将其写入链接列表中。我有一个将其写入列表的结构,因为整个列表都填充了文件中的姓氏。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Child child;

struct Child {
char *name;
child *next;
};

void readFromFile(char fileName[], child **head) {
FILE *file;

if (!(file = fopen(fileName, "rt"))) {
printf("Can't open file\n");
abort();
} else {
static char buffer[1024];
while (fgets(buffer, 1024, file)) {
child *new = (child *)malloc(sizeof(child));
new->name = buffer;
new->next = (*head);
(*head) = new;
}
}
fclose(file);
}

void printList(child *head) {
child *tmp = head;
while (tmp) {
printf("%s", tmp->name);
tmp = tmp->next;
}
}

int main() {
child *head = NULL;

readFromFile("file.txt", &head);
printList(head);

return 0;
}

文件包含这种样式的数据:

John
Ann
Adam
Arthur

最佳答案

您的读取循环使所有节点都指向同一个静态数组:

    static char buffer[1024];
while (fgets(buffer, 1024, file)) {
child *new = (child *)malloc(sizeof(child));
new->name = buffer;
new->next = (*head);
(*head) = new;
}

您应该为每个节点分配一个字符串副本:

    char buffer[1024];
while (fgets(buffer, sizeof buffer, file)) {
child *new_node = (child *)malloc(sizeof(child));
new_node->name = strdup(buffer);
new_node->next = *head;
*head = new_node;
}

还建议检查内存分配失败并避免使用 C++ 关键字。您可能还想从缓冲区中删除尾随换行符以及任何前导或尾随空格。

关于c - 从文件读取到链接列表时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55986287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com