c - C:无法从文本文件中显示链表
问题描述
因此,我无法将 txt 文件中的链接列表显示到屏幕上。这是我的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
struct sv
{
char name[20];
int age;
char phonenum[15];
struct sv *next;
};typedef struct sv SV;
struct data
{
char name[20];
int age;
char phonenum[15];
};typedef struct data DATA;
SV *head = NULL;
void show(SV *r)
{
r = head;
int count = 0;
if( r==NULL )
{
return;
}
while (r!=NULL)
{
if (count++ != 10)
{
printf("%s %d %s",r->name,r->age,r->phonenum);
}
else
{
printf("%s %d %s",r->name,r->age,r->phonenum);
count = 0;
}
r = r->next;
}
printf("\n");
}
void add(DATA &a)
{
SV *p,*right;
p = (SV*)malloc(sizeof(*p));
p->next = NULL;
right = head;
if (right==NULL)
{
head=p;
}
else
{
while(right->next != NULL)
right=right->next;
right->next = p;
}
}
void appendFile()
{
char line[100];
char *token;
char s[] = " ";
DATA d;
FILE *f = fopen("C:\\Users\\ADMIN\\Desktop\\mt.txt","r");
while (fgets(line,sizeof(line),f)!=NULL)
{
token = strtok(line,s);
while ( token != NULL )
{
printf( " %s\n", token );
sscanf(token, "%s %d %s", d.name,d.age,d.phonenum);
add(d);
token = strtok(NULL,s);
printf(" Token =%p \n", token);
}
}
printf("DONE!");
show(head);
}
int main()
{
appendFile();
show(head);
return 0;
}
当我使用 show() 函数时,它没有显示函数 appendFile() 从我创建的 txt 文件中读取的正确数据继承 txt 文件中的数据:
HuongLeNguyen 19 0934908500
DoTanTruongSanh 19 0934908511
这就是函数 show() 显示的内容:
╨xÜ 1330860869 RS=8╨xÜ 1551069797 ADMIN\OneDrive╨xÜ 1886405421 \MinGW64\bin;C:\ Ü╨xÜ 1986095708 apath;C:\WINDOWS`Ü╨xÜ 977484653 \WINDOWS\System3áÜ╨xÜ 1884249138 enSSH\;C:\Progra
╨xÜ 1330860869 RS=8╨xÜ 1551069797 ADMIN\OneDrive╨xÜ 1886405421 \MinGW64\bin;C:\ Ü╨xÜ 1986095708 apath;C:\WINDOWS`Ü╨xÜ 977484653 \WINDOWS\System3áÜ╨xÜ 1884249138 enSSH\;C:\Progra
有人可以帮我解决这个问题吗。如果有人可以提供帮助,我将不胜感激!
解决方案
关于:
p = (SV*)malloc(sizeof(*p));
p->next = NULL;
right = head;
if (right==NULL)
{
head=p;
}
传递参数a
中的数据字段永远不会复制到分配的内存中。因此,当尝试打印出该内存时,代码会尝试打印未初始化的字段。
关于:
sscanf(token, "%s %d %s", d.name,d.age,d.phonenum);
- 使用
%s
输入格式转换说明符时,需要始终包含一个比输入字段的长度小 1 的 MAX CHARACTERS 修饰符,因为该说明符总是将 NUL 字节附加到输入。这也避免了缓冲区溢出的任何可能性以及由此产生的未定义行为 参数
d.age
不是数组,所以需要指定地址,而不是内容。建议:sscanf(token, "%s %d %s", d.name, &d.age,d.phonenum );
但是,对 的调用strtok()
将停止并丢弃一个 NUL 字节,之后name
将对对 的调用产生一些不良影响sscanf()
。建议消除token
和调用strtok()
并使用类似的东西:
if( sscanf( line, "%s %d %s", d.name, &d.age, d.phonenum ) != 3)
{
fprintf( stderr, "failed to extract name, age, phonenum from input line\n" );
fclose( f );
// need to also pass all allocated memory to `free()` at this failure point
exit( EXIT_FAILURE );
}
然后如果调用sscanf()
成功,则使用strcpy
两个字符数组:name
并将phonenum
它们从d
结构复制到分配的内存。然后只需将结构的age
字段d
分配给分配的内存
推荐阅读
- flutter - 如何根据在颤动中单击哪个导航栏按钮来更改脚手架主体?
- c++ - C ++中向量错误的解决方案是什么?
- api-gateway - 如何将 JSON-RPC 请求分发到后端?
- kubernetes - Kubernetes 从节点本身耗尽节点的权限
- c++ - 将大括号括起来的初始化列表传递给可变参数宏并扩展为 std::pair<>
- scala - 迭代播放jsarray
- flutter - 使用 php laravel 请求下一页的 Flutter 分页
- html - 使用 HTML 和 CSS 插入背景图像,不起作用
- php - 还根据产品自定义字段更改 WooCommerce Minicart 项目价格
- html - 手机分辨率上的 Flex 框未对齐