代码可以运行,但是delet函数有bug,输入要删除的书名,用book[j]=book[j+1]后,还是能查询到书籍,我觉得是因为在main函数里面定义了指针book而不是数组book,如果是数组的话就不会出现这种问题。那么如何实现删除功能呢?
#include
#include
#include
void input(struct Book *book); //录入书籍
void inquire(struct Book *book, int book_num); //查询书籍名称
void print(struct Book *book); //打印书籍
void menu(int *flag); //目录
struct Time
{
int year;
int month;
int day;
};
struct Book
{
char name[200];
struct Time time;
char chubanshe[200];
};
void input(struct Book *Book) //录入书籍
{
printf("请输入书名:");
scanf("%s",Book->name);
printf("请输入年月日:");
//scanf("%d%d%d", &book[i].time.year, &book[i].time.month, &book[i].time.day);
scanf("%d%d%d",&((*Book).time.year),&(Book->time.month),&(Book->time.day));
printf("请输入出版社:");
scanf("%s",Book->chubanshe);
printf("\n======书籍录入成功======\n\n");
}
void inquire(struct Book *book, int book_num) //查询书籍名称
{
char name[200];
int i,flag = 0;
printf("\n请输入书籍名称:\n\n");
scanf("%s",name);
for(i = 0;i < book_num; i++)
{
if(strcmp(book[i].name, name) == 0)
{
printf("这是第%d本书\n",i + 1);
print(&book[i]);
flag = 1;
break;
}
}
if(flag == 0)
{
printf("\n===请重新输入书籍名称===\n\n");
inquire(book,book_num);
}
}
delet(struct Book *book,int book_num)
{ char name[50];
int flag=0;
printf("请输入书名:");
scanf("%s",name);
printf("\n");
for(int i=0;iif(strcmp(book[i].name, name) == 0)
{
flag=1;
printf("删除成功!!!\n");
book_num--;
for(int j=i;j-1;j++)
book[j]=book[j+1];//j+1!!! j最大等于book_num-2此时+1即为book_num-1
}
}
if(flag==0)
printf("=====查无此书!!!=====\n");
}
void print(struct Book *book) //输出查询到的书籍
{
printf("\n======书籍查询成功======\n\n");
printf("书 名:%s\n",book -> name);
printf("日 期:%d-%d-%d\n", book -> time.year, book -> time.month, book -> time.day);
printf("出版社:%s\n\n",book -> chubanshe);
}
void menu(int *flag) //目录
{
int mode;
printf("请选择模式:\n");
printf("1.输入1录入书籍;\n");
printf("2.输入2查询书籍;\n");
printf("3.输入3删除书籍;\n"); //未做
printf("4.输入4退出系统;\n");
scanf("%d",flag);
}
int main(void)
{
struct Book *book = NULL;//指针实现
int book_num = 0;
int flag;
while(1)
{
menu(&flag);
switch(flag)
{
case 1:
{
book_num++;
printf("这是第%d本书\n",book_num);
book = (struct Book *)realloc(book,(book_num + 1) * sizeof(struct Book *));//!!!
input(&book[book_num - 1]); break;
}
case 2: inquire(book,book_num); break;
case 3: delet(book,book_num); break;
case 4: free(book);exit(1);
default:printf("\n请重新输入\n\n");break;
}
}
return 0;
}
修改如下,供参考:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void input(struct Book* book); //录入书籍
void inquire(struct Book* book, int book_num);//查询书籍名称
void print(struct Book* book);//打印书籍
void menu(int* flag);//目录
int delet(struct Book* book, int book_num); //修改
struct Time
{
int year;
int month;
int day;
};
struct Book
{
char name[200];
struct Time time;
char chubanshe[200];
};
void input(struct Book* Book) //录入书籍
{
printf("请输入书名:");
scanf("%s", Book->name);
printf("请输入年月日:");
//scanf("%d%d%d", &book[i].time.year, &book[i].time.month, &book[i].time.day);
scanf("%d%d%d", &((*Book).time.year), &(Book->time.month), &(Book->time.day));
printf("请输入出版社:");
scanf("%s", Book->chubanshe);
printf("\n======书籍录入成功======\n\n");
}
void inquire(struct Book* book, int book_num) //查询书籍名称
{
char name[200];
int i, flag = 0;
printf("\n请输入书籍名称:\n\n");
scanf("%s", name);
for (i = 0; i < book_num; i++)
{
if (strcmp(book[i].name, name) == 0)
{
printf("这是第%d本书\n", i + 1);
print(&book[i]);
flag = 1;
break;
}
}
if (flag == 0)
{
printf("=====查无此书!!!=====\n"); //修改
//printf("\n===请重新输入书籍名称===\n\n");
//inquire(book, book_num);
}
}
int delet(struct Book* book, int book_num) //修改
{
char name[50];
int flag = 0;
printf("请输入书名:");
scanf("%s", name);
printf("\n");
for (int i = 0; i < book_num; i++)
{
if (strcmp(book[i].name, name) == 0)
{
for (int j = i; j < book_num - 1; j++)
book[j] = book[j + 1];//j+1!!! j最大等于book_num-2此时+1即为book_num-1
book_num--; //修改
flag = 1; //修改
printf("删除成功!!!\n"); //修改
break; //修改
}
}
if (flag == 0)
printf("=====查无此书!!!=====\n");
return book_num; //修改
}
void print(struct Book* book) //输出查询到的书籍
{
printf("\n======书籍查询成功======\n\n");
printf("书 名:%s\n", book->name);
printf("日 期:%d-%d-%d\n", book->time.year, book->time.month, book->time.day);
printf("出版社:%s\n\n", book->chubanshe);
}
void menu(int* flag) //目录
{
int mode;
printf("请选择模式:\n");
printf("1.输入1录入书籍;\n");
printf("2.输入2查询书籍;\n");
printf("3.输入3删除书籍;\n");
printf("4.输入4退出系统;\n");
scanf("%d", flag);
}
int main(void)
{
struct Book* book = NULL;//指针实现
int book_num = 0;
int flag;
while (1)
{
menu(&flag);
switch (flag)
{
case 1:
{
book_num++;
printf("这是第%d本书\n", book_num);
book = (struct Book*)realloc(book, (book_num + 1) * sizeof(struct Book));//sizeof(struct Book*) //修改
input(&book[book_num - 1]); break;
}
case 2: inquire(book, book_num); break;
case 3: book_num = delet(book, book_num); break; //修改
case 4: free(book); exit(1);
default:printf("\n请重新输入\n\n"); break;
}
}
return 0;
}
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。