#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int booknum=0;
struct TIME{
int year;
int month;
int day;
};
struct BOOK{
char name[250];
struct TIME time;
char cbs[250];
}*book=NULL;//定义book指针并赋值为空
void inquire(struct BOOK *book,int booknum);
void add(struct BOOK *book,int booknum);
void delet(struct BOOK *book);
void print(struct BOOK *book,int i);
void select();
void printall(struct BOOK *book);
void delet(struct BOOK *book)
{
char ch[25];
printf("请输入书名:\n");
scanf("%s",ch);
for(int i=0;i<booknum;i++)
{
if(strcmp(book[i].name,ch)==0)
{
strcpy(book[i].name,book[i+1].name);
book->time.year=0; book->time.month=0; book->time.day=0;
strcpy(book[i].cbs,book[i+1].cbs);
booknum--;
}
}
}
void inquire(struct BOOK *book,int booknum)//查询书籍
{
char ch;
while((ch=getchar())!='p')
{
char ch[25];
printf("请输入查询的书名:\n");
scanf("%s",ch);
for(int i=0;i<booknum;i++)
{
if(strcmp(book[i].name,ch)==0)
{
printf("\t此书编号\t\t书名\t\t出版日期\t\t出版社\t\n\n");
print(&book[i],i);//传参到输出函数print
//break;
}
else printf("查无此书!\n");break;
}
printf("输入p停止查询,否则继续查询...\n");
}
select();
}
void add(struct BOOK *book,int booknum)//添加书籍
{
char ch;
while((ch=getchar())!='p')
{
booknum++;
printf("这是第%d本书\n",booknum);
printf("请输入书名:\n");
scanf("%s",book->name);
printf("请输入出版日期(年月日):\n");
scanf("%d%d%d",&(book->time.year),&(book->time.month),&(book->time.day));
printf("请输入出版社:\n");
scanf("%s",book->cbs);
printf("====添加完成!====\n");
printf("输入p停止添加\n");
}
select();
}
void print(struct BOOK *book,int i)
{
printf("\t%d\t\t%s\t\t",i,book->name);
printf("%d-%d-%d",book->time.year,book->time.month,book->time.day);
printf("\t\t%s\t\n",book->cbs);
}
void select()//选择操作
{
int code;
printf("-----------------------------------------------------------------------------------------------------------------------\n\n");
printf("\t\t\t1.录入书籍\t\t2.查询书籍\n\n\t\t\t3.删除书籍\t\t4.结束程序\t\t5.打印所有书籍信息\n\n");
printf("-----------------------------------------------------------------------------------------------------------------------\n");
printf("\t 请选择模式:");
scanf("%d",&code);//输入非数字将陷入死循环
printf("\n\n");
switch(code)
{
case 1:add(book,booknum); break;
case 2:inquire(book,booknum);break;
case 3:delet(book); break;
case 4:exit(0); break;
case 5:printall(book); break;
default:printf("请重新输入选项!!!\n");break;
}
select();
}
void printall(struct BOOK *book)
{
printf("\t此书编号\t\t书名\t\t出版日期\t\t出版社\t\n\n");
for(int j=0;j<booknum;j++)
{
print(&book[j],j);
}
printf("====所有书籍信息打印完毕!====\n");
select();
}
int main()
{
printf("请选择操作:\n");
select();
return 0;
}
首先要说明一下,你的代码的错误实在是太多了,你现在的阶段不应该在这里问问题,而是需要找一本 C 的书去认真的学习一遍之后再开始实操。
你说的崩溃问题
你的 book 是个指针啊,你从来没给它分配过空间,就直接拿来用,可不崩溃么。
delet 函数(你想写的是 delete 吧?)
你找到一本书之后,把下一本书的名字、出版社覆盖到这,然后把日期清零了?这是什么操作?
而且你只覆盖了这一本,那么这本书就跟下一本相等了,不是应该把后面所有的数据都向前移动的吗?
查询
scanf 只会接收字符,然后把回车留在输入缓冲里面,所以你的 getchar 永远只能拿到回车
然后你在循环里面做 if..else 每个名字不等于你要查的书都会显示"查无此书!"
添加
跟上面一样的 scanf 问题
你有一个全局的 booknum 而每个函数又有局部的 booknum,局部的定义会覆盖掉全局的定义,你对 booknum 所有的修改都是无效的。
你这段代码完全是由 bug 堆砌起来的,真心建议你去系统的学完了再来提问题。