首页 > 解决方案 > 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

有人可以帮我解决这个问题吗。如果有人可以提供帮助,我将不胜感激!

标签: clinked-list

解决方案


关于:

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);
  1. 使用%s输入格式转换说明符时,需要始终包含一个比输入字段的长度小 1 的 MAX CHARACTERS 修饰符,因为该说明符总是将 NUL 字节附加到输入。这也避免了缓冲区溢出的任何可能性以及由此产生的未定义行为
  2. 参数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分配给分配的内存


推荐阅读