这个错误是什么意思,要怎么改

img


我想用冒泡排序做图书管理系统的排序,但不知道为什么写完函数内容后该函数不能执行。求指出一下怎么修改这个错误。
下面是别的相关代码。
全部源代码

img

img

img

img

img

img

img

img

img

img


img


img


#include <stdio.h>
#include <string.h>
#include

#include <stdio.h>
#include <string.h>
#include <cstdlib>

//存放书籍信息
typedef struct Book {
    char bkname[20];
    int bookid;
    int  lend;
    float  price;
    int  kucun;
} Book ;
struct Book book[20];
int xlh;//定义一个变量为书籍序列号
int crzl;//书籍的存入总量
int i = 0;//输入书籍的次数
int num;//用于防止再次登录后图书信息归零

//存放用户信息
typedef struct users { //typedef 可以定义结构体别名
    char id[11]; //账号
    char pwd[20]; //密码
    char name[15];//姓名为字符串
} users ;
struct users per[2];
int number = 1;//限制单次注册账号数量为1
struct users pe[2];

//存储用户账号数据
char id[11]; //账号
char pwd[20]; //密码
char name[15];//姓名为字符串



//欢迎界面
void  welcome() {
    printf("************欢迎使用图书管理系统*************\n");
    printf("1、管理员身份登录\n");
    printf("2、普通用户身份登录\n");
    printf("3、用户注册\n");
    printf("4、退出程序\n");
    printf("***********************************************\n");
}


//注册系统
void zhuce() {
    int t;
    for (t = 0; t < number; t++) {
        printf("请输入您注册的账号\n");
        scanf("%s", &per[t].id);
        printf("请输入密码\n");
        scanf("%s", &per[t].pwd);
        printf("请输入用户名\n");
        scanf("%s", &per[t].name);
    }
}


//登录系统
int  denglu() {
    int sf = 0;
    printf("请输入账号\n");
    scanf("%s", &id);
    if (strcmp(id, per[0].id) == 0) {
        //break;
    } else {
        printf("账号错误,请核对后输入\n");
        scanf("%s", &id);
    }
    printf("请输入密码\n");
    scanf("%s", &pwd);
    if (strcmp(pwd, per[0].pwd) == 0) {
        sf = 1;
        printf("登录成功\n");
    } else {
        printf("密码错误,请核对后输入\n");
        scanf("s", &pwd);
    }
    return 0;
}

//管理员的功能菜单
void  manager() {
    printf("***********欢迎进入管理员界面************\n");
    printf("             请选择您的功能\n                ");
    printf("1、\t添加图书信息\t2、删除图书信息\n   ");
    printf("3、\t查询图书信息\t4、修改图书信息\n    ");
    printf("5、返回上一级菜单\n");
    printf("*******************************************\n");
}

//管理员功能的实现
//结构体变量输入函数,录入书籍
void putbook() {
    char name[20];
    char  bookid[10];
    int  lend[10];
    int  price[10];
    char  kucun[10];
    int h;
    printf("请输入录入书记的数量\n");
    scanf("%d", &h);
    for (i = num; i < num  + h; i++) {
        printf("请输入书籍编号\n");
        scanf("%d", &book[i].bookid );
        printf("请输入书籍的借阅量\n");
        scanf("%d", &book[i].lend);
        printf("请输入书籍的价格\n");
        scanf("%f", &book[i].price);
        printf("请输入书籍的库存\n");
        scanf("%d", &book[i].kucun);
        printf("请输入书籍名称\n");
        scanf("%s", &book[i].bkname);
    }
    num = num + h;
}


//显示书籍
void Showbook() {
    for (i = 0; i < num; i++) {
        printf("书籍序号\t 书籍名称\t 书籍编号\t 书籍借阅量\t 书籍的价格\t 书籍的库存\n");
        printf("    %d\t        %s\t        %d\t        %d\t          %f\t        %d\n", i, &book[i].bkname, book[i].bookid,
               book[i].lend, book[i].price, book[i].kucun);
    }
}

//冒泡排序
void sort(Book book[], int n) {
    int j;
    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - i - 1; j--) {
            if (book[j].lend < book[j - 1].lend) {
                book[19] = book[j];
                memcpy(&book[j], &book[j + 1], sizeof(Book)); //交换数组的位置
                book[j + 1] = book[19];
            }

        }
    }
}

//删除图书数
void DeleteBook() {
    printf("请输入需要删除的图书序号");
    scanf("%d", &i); //输入修改的序号
    for (i = 0; i < 20; i++) {
        book[i].price = 0;
        book[i].lend = 0;
        book[i].bookid = 0;
        book[i].kucun = 0;
        //book[xlh].bkname = '\0';
        //memcpy(&book[i], &book[i + 1], sizeof(book));
        book[i] = book[i + 1];
    }
    printf("删除成功!\n");
}

//修改书籍数据
void updata() {
    printf("请输入需要修改图书的序号");
    scanf("%d", &xlh); //输入修改的序号
    printf("请输入修改后的图书名称");
    scanf("%s", &book[xlh].bkname);
    printf("请输入修改后的图书编号");
    scanf("%d", &book[xlh].bookid);
    printf("请输入修改后的图书借阅量");
    scanf("%d", &book[xlh].lend);
    printf("请输入修改后的图书价格");
    scanf("%f", &book[xlh].price);
    printf("请输入修改后的图书库存");
    scanf("%d", &book[xlh].kucun);
}


//普通用户菜单界面
void  comview() {
    printf("*************普通用户菜单界面***************\n");
    printf("           请选择您的功能\n          ");
    printf("1、        查询图书信息\n");
    printf("2、              借书              \n");
    printf("3、              还书             \n");
    printf("4、          修改账户密码          \n");
    printf("6、返回上一级菜单\n");
    printf("*********************************************\n");

}

//借书
void  lendbook() {
    printf("请输入您需要借阅的书籍序列号");
    scanf("%d", &xlh);
    if (book[xlh].kucun - book[xlh].lend <= 0) {
        printf("很抱歉该图书已被全部借走啦,下次早点来吧。\n");
    } else {
        printf("请输入您的用户名\n");
        scanf("%s", &name);
        book[xlh].kucun --;//库存减一
        book[xlh].lend ++;//借阅量加一
        printf("借书完成,享受阅读的乐趣吧。\n");
    }
}

//还书
void huanbook() {
    printf("请输入您需要归还的书籍序列号");
    scanf("%d", &xlh);
    printf("请输入您的用户名\n");
    scanf("%s", &name);
    book[xlh].kucun ++;//库存加一
    book[xlh].lend --;//借阅量减一
    printf("感谢您如约完成了还书,期待您的下次使用\n");
}

//修改用户账号的密码
void xiugaimima() {
    int xz;//用户的选择
    printf("请输入您的账号");
    scanf("%s", &id);
    if (strcmp(id, per[0].id) == 0) {
    } else {
        printf("账号错误,请核对后输入\n");
        scanf("%s", &id);
    }
    printf("请输入原密码\n");
    scanf("%s", &pwd);
    if (strcmp(pwd, per[0].pwd) == 0) {
        printf("请输入新的密码");
        scanf("%s", per[0].pwd);
    } else {
        printf("密码错误,请核对后输入\n");
        scanf("s", &pwd);
    }
    printf("请问您是否需要修改用户名?\n");
    printf("需要请输入1,不需要请输入2");
    scanf("%d", &xz);
    if (xz == 1) {
        printf("请输入新的用户名");
        scanf("%s", &per[0].name);
    } else if (xz == 2) {
    }
}



int  main() {

    do {

        //程序一开始就进入欢迎界面
        welcome();
        //选择登录进入程序的方式
        int   xh;
        printf("请选择登录方式");
        scanf("%d", &xh);
        if (xh == 1) {
            //管理员的菜单功能
            while (1) {
                int sf = denglu();
                if (sf == 0) {
                }
                printf("欢迎管理员登录\n");
                manager();
                int cd;
                scanf("%d", &cd);
                if (cd == 1) {
                    putbook();
                    break;
                } else if (cd == 2) {
                    DeleteBook();
                } else if (cd == 3) {
                    Showbook();
                } else if (cd == 4) {
                    updata();
                } else if (cd == 5) {
                    sort(book, n);
                } else if (cd == 6) {
                    //返回上一级菜单
                    break;
                }
            }

        } else if (xh == 2) {
            //普通用户菜单界面
            while (1) {
                int sf = denglu();
                if (sf == 0) {
                }
                printf("欢迎用户%s登录\n", &per[0].name);
                comview();
                int cxh;
                scanf("%d", &cxh);
                if (cxh == 1) {
                    Showbook();
                } else if (cxh == 2) {
                    lendbook();
                } else if (cxh == 3) {
                    huanbook();
                } else if (cxh == 4) {
                    xiugaimima();
                    break;
                } else if (cxh == 6) {
                    //返回上一级菜单界面
                    break;
                }
            }

        } else if (xh == 3) {
            zhuce();
            printf("注册成功\n");
        } else if (xh == 4) {
            break;
        }
    } while (1);

    return 0;
}

```

book[i]=book[i+1]不能直接这么用,结构体类型的数组不能直接赋值的,需要用到memcpy指令,比如:
memcpy(&book[i],&book[i+1],sizeof(Book));

sort函数调用 ,需要传入 book数组 和 一个整数 n

sort(books,  n);  // books 为数组名, n 为数组的长度