三刀流.索隆 发表于 2021-2-13 20:30:07

这不是我想要的输出结果啊!

昨天刚学完结构体,小甲鱼布置了个图书馆程序的课后作业,我写的程序可以运行,可是输出结果总不正确,写程序花了1个小时,改BUG花了我2个半小时还没搞好,请各位大神帮看看,改好我好开始学习链表了{:5_99:}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


struct Date
{
        int year;
        int month;
        int day;
};

struct Book
{
        char title;
        char auther;
        float price;
        struct Date date;
        char publisher;
};




//录入书本信息
void getInput(struct Book *book,int *hao2)
{
       
        printf("请输入书名:");
        scanf("%s",book->title);
        printf("请输入作者:");
        scanf("%s",book->auther);
        printf("请输入售价:");
        scanf("%f",&book->price);
        printf("请输入出版日期:");
        scanf("%d %d %d",&(*book).date.year,&(*book).date.month,&book->date.day);
        printf("请输入出版社:");
        scanf("%s",book->publisher);
        (*hao2)++;
        printf("\n录入成功!!!\n书本编号为:%d\n",*hao2);
       

}

//打印输入结果
void printBook(struct Book *book )
{
        printf("书名:%s\n",book->title);
        printf("作者:%s\n",(*book).auther);
        printf("出版日期:%d-%d-%d\n",(*book).date.year,(*book).date.month,(*book).date.day);
        printf("售价:%.2f\n",(*book).price);
        printf("出版社:%s\n",(*book).publisher);
       

}
int main(void)
{       
       
        int i=0,hao1=1000,zhao1,c=1;
        int*hao2;
        hao2=&hao1;
        struct Book *b;
        struct Book *library;
       
        b = (struct Book*) malloc(sizeof(struct Book));
        //b = (struct Book*) malloc(sizeof(struct Book));
        //b =
        /*        if(b == NULL)
                {
                        printf("申请失败!!!");
                        exit(1);
                }
        */
                while(c!=-1)
        {
       
               
                printf("请输入书的信息;\n");
                getInput((b+i),hao2);
                putchar('\n');
                i++;
                        printf("\n是否继续录入书本信息?输入-1退出输入,输入1继续录\n");
        scanf("%d",&c);
                b++;
       
        }
       
        printf("请问是否要查找书本?,1--查找,0--退出\n");
        scanf("%d",&zhao1);
        if(zhao1==1)
        {

//============这里就是查找书籍的模块了============================//

                printf("请输入您要查找的书的编号\n");
                scanf("%d",&hao1);
               
                if(hao1<1000||hao1>1050)
                {
                        printf("对不起,输入无效,请检查\n");
                }
                else
                {
                       
                        hao1 = hao1-1002;
//====================这里是函数打印语句=======================//
                        printBook(&(b));
                }
        }
        free(b);
       
return 0;
       

一叶枫残 发表于 2021-2-13 21:58:39

getInput((b+i),hao2);这里怎么能随便传入结构体地址加一个整型值。。。

一叶枫残 发表于 2021-2-13 22:21:15

本帖最后由 一叶枫残 于 2021-2-13 22:44 编辑

1.如果你要存多本书的信息,建议用结构体数组;(后面会有更好用的单链表会学到的,现在没学可以用结构体数组)
2.每个结构体都要分配内存,但你的程序只分配了1个结构体指针的内存;
3.你前面没定义结构体的数组不要这样用:printBook(&(b);
4.while这个b++也很随便,不能这样用;

一叶枫残 发表于 2021-2-13 22:29:46

本帖最后由 一叶枫残 于 2021-2-13 22:33 编辑

大部分没错的,简单改改就ok了,看注释,不明白再问
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


struct Date
{
      int year;
      int month;
      int day;
};

struct Book
{
      char title;
      char auther;
      float price;
      struct Date date;
      char publisher;
};




//录入书本信息
void getInput(struct Book *book,int *hao2)
{
      
      printf("请输入书名:");
      scanf("%s",book->title);
      printf("请输入作者:");
      scanf("%s",book->auther);
      printf("请输入售价:");
      scanf("%f",&book->price);
      printf("请输入出版日期:");
      scanf("%d %d %d",&(*book).date.year,&(*book).date.month,&book->date.day);
      printf("请输入出版社:");
      scanf("%s",book->publisher);
      (*hao2)++;
      printf("\n录入成功!!!\n书本编号为:%d\n",*hao2);
      

}

//打印输入结果
void printBook(struct Book *book )
{
      printf("书名:%s\n",book->title);
      printf("作者:%s\n",(*book).auther);
      printf("出版日期:%d-%d-%d\n",(*book).date.year,(*book).date.month,(*book).date.day);
      printf("售价:%.2f\n",(*book).price);
      printf("出版社:%s\n",(*book).publisher);
      

}
int main(void)
{      
      
      int i=0,hao1=1000,zhao1,c=1,j=0;        //这里多定义一个j,方便释放内存(i的数据要保留,不然清除了就不知道分配了多少个结构体指针的内存)
      int*hao2;
      hao2=&hao1;
      struct Book *b;        //这里改用指针数组,就是用来放指针的数组
      struct Book *library;
      
      while(c!=-1)
      {
      
                       b = (struct Book*) malloc(sizeof(struct Book));        //每放一本书,就分配一次内存
                printf("请输入书的信息;\n");
                getInput( b , hao2);
                putchar('\n');
                i++;
                printf("\n是否继续录入书本信息?输入-1退出输入,输入1继续录\n");
                      scanf("%d",&c);
                                                                                       //b++删掉
      }
      
      printf("请问是否要查找书本?,1--查找,0--退出\n");
      scanf("%d",&zhao1);
      if(zhao1==1)
      {

//============这里就是查找书籍的模块了============================//

                printf("请输入您要查找的书的编号\n");
                scanf("%d",&hao1);
               
                if(hao1<1000||hao1>1050)
                {
                        printf("对不起,输入无效,请检查\n");
                }
                else
                {
                     
                        hao1 = hao1-1001;        //这里改为-1001,因为数组从0开始算
//====================这里是函数打印语句=======================//
                        printBook( b );                //因为这个数组存放的就是指针,所以不用加&
                }
      }
      for(j=0;j<i;j++)                        //分配的内存都释放掉,i的作用就是保存分配了多少个内存的数据
      {
              free( b );               
        }
      
      
return 0;

}

三刀流.索隆 发表于 2021-2-14 08:47:52

一叶枫残 发表于 2021-2-13 21:58
getInput((b+i),hao2);这里怎么能随便传入结构体地址加一个整型值。。。

hao2是一个基本指针变量,不是整型变量啊

三刀流.索隆 发表于 2021-2-14 09:32:47

谢谢你,我也会加油的{:5_108:}

一叶枫残 发表于 2021-2-14 17:44:51

三刀流.索隆 发表于 2021-2-14 08:47
hao2是一个基本指针变量,不是整型变量啊

我说那个b+i,指针加整数一般只有声明了数组之后才用
页: [1]
查看完整版本: 这不是我想要的输出结果啊!