这不是我想要的输出结果啊!
昨天刚学完结构体,小甲鱼布置了个图书馆程序的课后作业,我写的程序可以运行,可是输出结果总不正确,写程序花了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;
getInput((b+i),hao2);这里怎么能随便传入结构体地址加一个整型值。。。 本帖最后由 一叶枫残 于 2021-2-13 22:44 编辑
1.如果你要存多本书的信息,建议用结构体数组;(后面会有更好用的单链表会学到的,现在没学可以用结构体数组)
2.每个结构体都要分配内存,但你的程序只分配了1个结构体指针的内存;
3.你前面没定义结构体的数组不要这样用:printBook(&(b);
4.while这个b++也很随便,不能这样用; 本帖最后由 一叶枫残 于 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-13 21:58
getInput((b+i),hao2);这里怎么能随便传入结构体地址加一个整型值。。。
hao2是一个基本指针变量,不是整型变量啊 谢谢你,我也会加油的{:5_108:} 三刀流.索隆 发表于 2021-2-14 08:47
hao2是一个基本指针变量,不是整型变量啊
我说那个b+i,指针加整数一般只有声明了数组之后才用
页:
[1]