c语言写了个图书管理代码,选项为1.2.3的时候运行bug,核对好多遍了,哪里出错了?

新手上路,请多包涵
#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;
}
回复
阅读 845
1 个回答

首先要说明一下,你的代码的错误实在是太多了,你现在的阶段不应该在这里问问题,而是需要找一本 C 的书去认真的学习一遍之后再开始实操。

  1. 你说的崩溃问题

    struct BOOK{
     char name[250];
     struct TIME time;
     char cbs[250];    
    }*book=NULL;//定义book指针并赋值为空

    你的 book 是个指针啊,你从来没给它分配过空间,就直接拿来用,可不崩溃么。

  2. delet 函数(你想写的是 delete 吧?)

    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--;
         }
     }
    }

    你找到一本书之后,把下一本书的名字、出版社覆盖到这,然后把日期清零了?这是什么操作?
    而且你只覆盖了这一本,那么这本书就跟下一本相等了,不是应该把后面所有的数据都向前移动的吗?

  3. 查询

    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();    
    }

    scanf 只会接收字符,然后把回车留在输入缓冲里面,所以你的 getchar 永远只能拿到回车
    然后你在循环里面做 if..else 每个名字不等于你要查的书都会显示"查无此书!"

  4. 添加

    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();      
    }

    跟上面一样的 scanf 问题

  5. booknum 的问题
    你有一个全局的 booknum 而每个函数又有局部的 booknum,局部的定义会覆盖掉全局的定义,你对 booknum 所有的修改都是无效的。

你这段代码完全是由 bug 堆砌起来的,真心建议你去系统的学完了再来提问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏