李忠老师《C语言非常道》习题6.20解答参考

1、使得malloc和fscanf函数在代码中只出现一次

PSSTUD get_stud_info1 (void)  //使malloc和fscanf在代码中只出现一次
{
    FILE * pf = fopen ("students.dat", "r");
    if (pf == NULL)
    {
        printf ("File open failed.\n");
        return NULL;
    }
    PSSTUD pre,cur,pstd=NULL;
    int bfscf;
    do
    {
        if((cur=malloc(sizeof(SSTUD)))==NULL)
        {
            printf ("Memory allocated failed.\n");
            if(pstd!=NULL) destroy_stud_info (pstd);
            return NULL;
        }
        else if(pstd==NULL&&cur!=NULL)
        {
            pstd=cur;
        }
        //cur->next=NULL;
        bfscf=fscanf (pf, "%s%s%u%s%f", cur -> name,\
                          cur -> gender, & cur -> age,\
                          cur -> grade, & cur -> score);

        if(cur==pstd&&bfscf==EOF)
        {
            printf ("Empty file.please append some records.\n");
            free (pstd);
            return NULL;
        }else if(cur==pstd&&bfscf!=EOF){
            pre=cur;
            //cur=cur->next;
            //continue;
        }
        if(bfscf!=EOF)  //if(cur!=pstd&&bfscf!=EOF)
        {
            pre->next=cur;
            pre=pre->next;
            cur=cur->next;
        }

    }
    while(bfscf!=EOF);
    free(cur);
    pre->next=NULL;
    fclose(pf);
    return pstd;
}

2、从标准输入获得信息,可重定位到文件exe < students.dat

PSSTUD get_stud_info2 (void)  //标准输入获得信息
{
    fprintf(stdout,"please enter 5 data: %-13s%-8s%-5s%-7s%-7s\n","Name<20byte","Gender","Age","Grade","Score");
    printf("Gender: F/M/Female/Male\n");
    printf("Grade:  freshman/sophomore/junior/senior\n");
    printf ("------------"\
            "-------------------------------------------\n");
    PSSTUD pre,cur,pstd=NULL;
    int bfscf;
    do
    {
        if((cur=malloc(sizeof(SSTUD)))==NULL)
        {
            printf ("Memory allocated failed.\n");
            if(pstd!=NULL) destroy_stud_info (pstd);
            return NULL;
        }
        else if(pstd==NULL&&cur!=NULL)
        {
            pstd=cur;
        }
        //cur->next=NULL;

        bfscf=fscanf (stdin, "%s%s%u%s%f", cur -> name,\
                      cur -> gender, & cur -> age,\
                      cur -> grade, & cur -> score);
                      scanf("%*[^\n]");
        //getchar();

        if(cur==pstd&&bfscf!=5)
        {
            printf ("wrong data.please enter again.\n");
            free (pstd);
            pstd=NULL;
            continue;
        }
        else if(cur==pstd&&bfscf!=EOF)
        {
            pre=cur;
            //cur=cur->next;
            //continue;
        }

        if(bfscf!=5&&bfscf!=EOF)
        {
            printf ("wrong data.please enter again.\n");
            free(cur);
            continue;
        }
        if(bfscf!=EOF)  //if(cur!=pstd&&bfscf!=EOF)
        {
            pre->next=cur;
            pre=pre->next;
            cur=cur->next;
        }
        //if(getchar()=='\n')break;

    }
    while(bfscf!=EOF);
    free(cur);
    pre->next=NULL;

    return pstd;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HsiaoShawn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值