gpt4 book ai didi

C:将文本读入链表

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

我正在尝试从文本文件中读入链表。文本文件包含书名、作者和年份,以“:”分隔。每本书都在一个单独的行。文本文件条目如下所示:

Absalom, Absalom!:William Faulkner:1936
After Many a Summer Dies the Swan:Aldous Huxley:1939
Ah, Wilderness!:Eugene O'Neill:1933

我正在从头开始重写它。评论将不胜感激。

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

struct BookNode
{
char linebuffer[128];
char delim[]=":";
char * Title[50];
char * Author[50];
char * Year[5];
struct BookNode *next;
// char *token = NULL;
};

int main(void)
{
static const char booklist[]= "booklist.txt";
FILE *fr=fopen("booklist.txt", "r");
if ( fr != NULL)

{
char Title[50];
char Author[50];
char Year[5]
struct BookNode Booknode;
while (fgets(linebuffer,128, fr) != NULL &&
sscanf(line, "%49s %49s %4s",
&BookNode.Title, BookNode.Author, BookNode.Year)==3)
{
printf("%50s %50s %5s",
BookNode.Title, BookNode.Author, BookNode.Year);
}
}

最佳答案

您的代码中目前存在多个问题。

第一个(我没骗你)是代码格式和缩进。您粘贴的示例没有常规范式或缩进可言。即使在像这样的简短示例中,也很难遵循代码流。始终缩进您的代码,并选择一种编码风格(有多种)并坚持下去。

关于代码流程,第一个问题是错误检查。即,您检查 fopen返回状态,但如果打开文件失败则不采取足够的措施。

第二个问题是概念性问题。您似乎没有意识到 N 个字符的数组只能容纳长度为 N-1 的字符串。因此,char[4]几乎不是一种适合将年份存储为字符串的格式。

现在已经解决了这些问题,以下是在任何情况下都会阻止您的代码正常工作的实际缺陷:

1) fgets函数将一直读取,直到它填满您的缓冲区或到达行尾或文件尾字符。然而你还是打电话fgets三次尝试读取文件中的单行条目。您想做什么不太可能。您必须重新考虑循环的内容。

2) 您的“主”循环条件可能存在缺陷。这是对 feof 的一个非常普遍的误解。 &公司假设您的数据文件末尾包含一个换行符(并且这样做只是常规的),您的循环将执行一次太多。

最好像这样构造你的行读取循环:

while (fgets(buffer, BUF_SIZE, stdin)) { /* parse buffer */ }

3) 您的代码中存在内存管理方面的基本问题:即函数 addEntry无法分配内存来存储您的记录。相反,链接列表中的所有条目最终将指向您在 main 中分配的同一个共享缓冲区。功能。

有几种方法可以解决这个问题。一种是多次调用 malloc对于您的每个成员 BookNode结构( titleauthoryear )。另一种可能更可取的方法是使用可变大小的结构,如下所示:

struct BookNode {
char *title;
char *author;
char *year;
struct BookNode *next;
char buffer[]; // this shorthand requires C99
};

对于每个 struct BookNode您在它们之后分配足够的存储空间,以便您可以将共享缓冲区的内容复制到那里。 title , author , 和 year然后指向这个附加存储。这样您就不会在循环的下一次迭代中最终覆盖其他 BookNode 的内容。而你只需要一个free释放整个节点。

我可能没有在这里列出您代码中的所有问题。也许您应该首先尝试解决一个较小的子问题,而不是再次重写,例如从 stdin 中读取单个条目。并从那里开始 build ?

关于C:将文本读入链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10870235/

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