我只是在学习链接列表,我必须做一个包含许多部分的任务,但我已经开始了,我需要做的第一件事是将输入文件读入链表。 部分文件是:
George Washington, 2345678 John Adams, 3456789 Thomas Jefferson, 4567890 James Madison, 0987654 James Monroe, 9876543 John Quincy Adams, 8765432
并包含总共26行。
我现在要做的只是简单地在文件中读取。 我尝试使用此代码(现在在main中)
#include #include struct node{ char name[20]; int id; struct node *next; }*head; int main(void){ struct node *temp; temp = (struct node *)malloc(sizeof(struct node)); head = temp; FILE *ifp; ifp = fopen("AssignmentOneInput.txt", "r"); int c = 0; while(cname); fscanf(ifp, "%d", &temp->id); printf("%dn", c); temp = temp->next; c++; }
对于输出,我知道扫描了第一个名称和第一个ID,因为c的值显示为0(现在我任意使用c的值来控制fscanf)。 但在那之后,程序崩溃了。 所以问题必须是temp = temp->next;
它汇编很好。
我对链接列表很新,所以我真的不知道我在做什么。
非常感谢您的帮助!
在以下行中,您已为列表的单个元素(一个struct node
)分配了足够的空间,并将head
指针指向它:
temp = (struct node *)malloc(sizeof(struct node)); head = temp;
稍后您将值读入此元素的name
和id
字段:
fscanf(ifp, "%s", &temp->name); fscanf(ifp, "%d", &temp->id);
但是temp->next
指的是什么? 你到目前为止只为一个元素分配了空间。 在将每个后续元素添加到列表中时,需要为每个后续元素分配空间。
编辑:正如下面指出的@ merlin2011,这个答案将简单地帮助您解决程序崩溃,但不会完全让您的程序正常运行。 但是,希望你能够在没有崩溃的情况下更好地调试它。
主要问题当然是temp = temp->next
将temp设置为next
,从未初始化,导致代码被seg。 下一个循环出错。
有链表问题和输入问题。 建议在找到好的数据之前不要分配空间。
从temp_head
开始。 代码仅使用temp_head
的next
字段。
struct node temp_head; temp_head.next = NULL; struct node *p = &temp_head;
每当代码读取行数据时,建议使用fgets()
读取行 ,然后扫描缓冲区。
char buf[100]; while (fgets(buf, sizeof buf, ifp) != NULL) { struct node nbuf;
使用sscanf()
扫描缓冲区。 使用'%[^,]'
读取直到','
。
if (2 != sscanf(buf, " %19[^,],%d", nbuf.name, &nbuf.id)) { break; // Invalid data encountered } nbuf.next = NULL; // Code does not allocate data until good data was found p->next = malloc(sizeof *(p->next)); if (p->next == NULL) break; // OOM p = p->next; *p = nbuf; // Copy the data } head = temp_head.next;
笔记:
temp = (struct node *)malloc(sizeof(struct node));
不需要。
考虑这种分配方式: temp = malloc(sizeof *temp)
,IMO更容易编码,维护更少。
fscanf(ifp, "%s", &temp->name); fscanf(ifp, "%d", &temp->id);
有3个问题:字符串输入没有限制,不需要和无法检查扫描结果。 注意上面的代码使用(2 != sscanf(buf, " %19[^,], %d", nbuf.name, &nbuf.id)
,它将字符串输入限制为19个char
(为终止' '
留出空间' '
,当字段是数组时,不使用&
,并检查是否成功扫描了2个字段。
在main()
结束之前,代码应该释放分配的数据。
首先,由于你是用C
编写的,所以没有必要使用malloc
。
其次,您必须自己为每个新节点分配内存。
第三,数组的名称已经衰减到一个指针,所以你不应该使用它,因为那样你就会得到一个指向你不想要的指针。
最后,您需要修复scanf
语法以处理字段中的空格。
#include #include #include struct node{ char name[20]; int id; struct node *next; }*head; int main(void){ struct node *temp; temp = malloc(sizeof(struct node)); temp->next = NULL; head = temp; FILE *ifp; ifp = fopen("AssignmentOneInput.txt", "r"); int c = 0; char buffer[1024]; memset(buffer, 0, 1024); while(c<5){ fgets(buffer, 1024, ifp); sscanf(buffer, "%19[^,], %d", temp->name, &temp->id); printf("%d %s %dn",c, temp->name, temp->id); temp->next = malloc(sizeof(struct node)); temp = temp->next; temp->next = NULL; c++; } }
以上就是c/c++开发分享在文本文件中扫描到链接列表相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/518819.html