这个是什么问题亚

来源:5-1 Linux C 动态数据结构-静态链表

Ocelot

2020-07-19 10:24

部分代码:(主要是这里有问题)

#define USERINFO_FILE                   "/home/ocelot/pmm/data/info.txt"
//用户信息表记录文档路径

#define SAVES_HOME_PATH                 "/home/ocelot/pmm/data/"

#define _STRUCT_USER_INFO_SIZE          (sizeof(struct user_info))
//struct user_info类型结构体大小

#define _END_LOOP                       "$!END_0"

extern struct user_info * getUserInfo()
{
        FILE *fp = fopen(USERINFO_FILE,"r");

        //若文件不存在,则返回空指针
        if(fp == NULL)
                return NULL;

        char    buf[64];                //缓冲字符串
        int     user_num = 0;           //用户数量

        //获取用户数量
        while(fscanf(fp,"%s",buf) != EOF)
        {
                if(buf[0] == '[')
                        user_num++;
        }

        struct user_info        *pi = (struct user_info *)malloc(_STRUCT_USER_INFO_SIZE * (user_num+1));
        //动态分配结构体数组
        fclose(fp);

        FILE *fp_s = fopen(USERINFO_FILE,"r");
        //若文件不存在,则返回空指针
        if(fp == NULL)
                return NULL;

        int     serial = 0;             //读入的用户序号
        while(fscanf(fp_s,"%s",buf) != EOF)
        {
                //忽略注释行
                if(buf[0] == '#')
                        continue;
                //将Name存入数组
                if(buf[0] == '[')
                        serial++;

if(buf[0] == 'N')
                {
                        printf("##%s##\n",buf);
                        //指向下一个用户
                        strcpy(pi->name,//getStrPointStr(buf,':')
                                        buf);
                        pi+=(_STRUCT_USER_INFO_SIZE * 1);
                }
                //将Pw存入数组
                else if(buf[0] == 'P')
                {
                        sprintf(pi->pw,"%s",getStrPointStr(buf,':'));
                }
                //忽略其他属性
                else
                        continue;
        }

        //设定结束标志
        pi+=(_STRUCT_USER_INFO_SIZE * 1);
        sprintf(pi->name,"%s",_END_LOOP);
        sprintf(pi->pw,"%s",_END_LOOP);

        pi-=(_STRUCT_USER_INFO_SIZE * serial);
        //将结构体指针指向第一个用户

        fclose(fp_s);
        return pi;
}

输出:

##Name:ocelot##
##Name:whisper##
##Name:xiaoyue##
##Name:xiaoyue##
##Name:xiaoyue##
##Name:xiaoyue##
##Name:xiaoyue##
登录:
用户列表:
[1]    9�ӋU
[2]    Name:xiaoyue
[3]    Name:xiaoyue
[4]    Name:xiaoyue
[5]    Name:xiaoyue
[6]    Name:xiaoyue
[7]    

改了很多次,还是有问题

但用户数量小于等于3个时不会有这种情况,不知道为什么


写回答 关注

2回答

  • 慕梦前来
    2022-05-01 17:51:40

    看判断那儿是不是不对

  • 慕梦前来
    2021-07-09 08:26:45

    编码就不对了吧

Linux C语言结构体

C语言的深入,帮助小伙伴们进一步的理解C语言,赶紧看过来

118294 学习 · 162 问题

查看课程

相似问题