gpt4 book ai didi

C: fgets 构建char*链表的用法

转载 作者:太空宇宙 更新时间:2023-11-04 01:20:05 25 4
gpt4 key购买 nike

我是否错误地使用了 fgets()

我正在尝试构建一个字符串链表 (char *),将每个新行添加到 LL 的末尾。我正在从一个文件中读取这些行,但由于某种原因,每一行都会被正在处理的当前行覆盖,只有在 while 循环中使用 fgets() 时,但是add 函数似乎正确接收了每一行。

如果我在 main() 中单独添加行,则没有问题。

这是一个示例输入文件:

输入.txt:

This life, which had been the
tomb of his virtue and of his
honour, is but a walking
shadow; a poor player, that
struts and frets his hour upon
the stage, and then is heard
no more: it is a tale told by an
idiot, full of sound and fury,
signifying nothing.
--William Shakespeare

代码:

#include <stdio.h> //printf, fopen
#include <stdlib.h> //exit, EXIT_FAILURE
#include <string.h> //strlen

struct node {
char *line;
struct node *next;
};

void print(struct node *node);

void add(struct node **head, char *newLine) {
//printf("%s", newLine);

struct node *new_node = (struct node *)malloc(sizeof(struct node));
struct node *curr = *head;

new_node->line = newLine;
new_node->next = NULL;

if (*head == NULL) {
*head = new_node;
} else {
while (curr->next != NULL) {
curr = curr->next;
}
curr->next = new_node;
}
print(*head);
}

void print(struct node *node) {
printf("\n");

while (node != NULL) {
printf("%s\n", node->line);
node = node->next;
}
}

int main(int argc, char *argv[16]) {
char newLine[81];
struct node *head = NULL;
FILE *fp = fopen(argv[1], "r");

if (fp == NULL) {
printf("ERROR: file open failed");
exit(EXIT_FAILURE);
}

while (fgets(newLine, 81, fp)) {
add(&head, newLine);
}

add(&head, "why");
add(&head, "does");
add(&head, "this");
add(&head, "work??");

fclose(fp);

print(head);

return 0;
}

有人可以向我解释发生了什么吗?我用头撞墙太久了。已经有一些我一直在尝试使用的注释打印语句,但未成功进行调试。

最佳答案

您的问题出在 add() 方法中。它不断向列表中添加相同的缓冲区指针。您需要将列表中的缓冲区复制到新分配的空间,即。node->line 也需要分配,并将 newLine 复制到其中。不要忘记 malloc (strlen (newLine) + 1)。

关于C: fgets 构建char*链表的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46243081/

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