c语言程序exe运行停止

c语言程序设计,选择序号2的时候程序停止运行
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main();
void luru();
void chakan();
void jieyue();
void guihuan();
void chazhao();
void shanchu();



void cun()//文件
{
    FILE *fp;
    fp=fopen("book1.txt","wt");
    if(fp==NULL)
    {
    printf("\n不能打开book.txt");
    getch();
    exit(1);
    }
}


struct date
{
    int year;
    int month;
    int day;
};
struct  book//结构体写书的信息
{
    char name[21];//书名
    char name2[21];//作者
    float money;//价格
    int num;//书的编号
    int many;//数量
    struct date Rdate;//书的录入日期
    
};
struct book b[20];//结构体变量


void menu()//菜单
{
    printf("=====================================\n");
    printf(" 【******欢迎使用图书管理系统******】\n");
    printf("‖系统菜单:                        ‖\n");
    printf("‖1.录入新书籍(首次使用)            ‖\n");
    printf("‖2.查看已录入书籍                  ‖\n");
    printf("‖3.借阅书籍                        ‖\n");
    printf("‖4.归还书籍                        ‖\n");
    printf("‖5.删除已录入书籍                  ‖\n");
    printf("‖6.查找书籍                        ‖\n");
    printf("‖0.退出系统                        ‖\n");
    printf("=====================================\n");
    printf("请输入序号:\n");
    int a;
    scanf("%d",&a);//输入序号
    switch (a)//选择序号
    {
    case 1:luru();break;
    case 2:chakan();break;
    case 3:jieyue();break;
    case 4:guihuan();break;
    case 6:chazhao();break;
    case 5:shanchu();break;
    case 0:printf("按任意键退出系统!");break;
    default: printf("未输入正确序号");break;
    }
}

void luru()//录入函数
{    int n1,i,j,k;
    int flag=0;

    FILE *fp1;//存书的信息指针
        fp1=fopen("book1.txt","wt");//只写
        if(fp1==NULL)
        {
            printf("\n不能打开book1.txt");
            getch();
            exit(1);
        }
        FILE *fpi;//存下标指针
        fpi=fopen("i.txt","wt");//只写
        if(fpi==NULL)
        {
            printf("\n不能打开i.txt");
            getch();
            exit(1);
        }
    FILE *fpf;//存标识符指针
        fpf=fopen("flag1.txt","wt");//只写
        if(fpf==NULL)
        {
            printf("\n不能打开flag1.txt");
            getch();
            exit(1);
        }

        if (fscanf(fpf,"%d",flag)==EOF)
        flag=0;
        else flag=fscanf(fpf,"%d",flag);

    if (flag==0)
{    printf("请输入录入书籍的个数(<=20):\n");
    scanf("%d",&n1);

for (i=0;i<n1;i++)
    {
    printf("当前正在录入第%d种书\n",i+1);
    printf("请输入书名:\n");
    scanf("%s",&b[i].name);
    printf("请输入作者:\n");
    scanf("%s",&b[i].name2);
    printf("请输入价格(可用小数):\n");
    scanf("%f",&b[i].money);
    printf("请输入编号:\n");
    scanf("%d",&b[i].num);
    printf("请输入入库数量:\n");
    scanf("%d",&b[i].many);
    printf("请输入录入日期(年(空格)月(空格)日):\n");
    scanf("%d %d %d",&b[i].Rdate.year,&b[i].Rdate.month,&b[i].Rdate.day);
    
    fprintf(fp1,"%s %s %f %d %d %d %d %d",b[i].name,b[i].name2,b[i].money,b[i].num,b[i].many,b[i].Rdate.year,b[i].Rdate.month,b[i].Rdate.day);//存书籍信息
    
    flag=flag+1;
    
    }
fprintf(fpi,"%d",i);
fprintf(fpf,"%d",flag);//存标识符
    fclose(fp1);
    fclose(fpi);
    fclose(fpf);
}
    //未使用//
    else if (flag>0&&flag<=20-flag)    
    {    

        printf("请输入新录入书籍的个数:\n");
        scanf("%d",&k);
        for (flag;flag<=k+flag;flag++)
        {
            printf("请输入书名:\n");
            scanf("%s",&b[flag].name);
            printf("请输入作者:\n");
            scanf("%s",&b[flag].name2);
            printf("请输入价格:\n");
            scanf("%f",&b[flag].money);
            printf("请输入编号:\n");
            scanf("%d",&b[flag].num);
            printf("请输入入库数量:\n");
            scanf("%d",&b[flag].many);
            printf("请输入录入日期:\n");
            scanf("%d %d %d",&b[flag].Rdate.year,&b[flag].Rdate.month,&b[flag].Rdate.day);
            
        }
    }
    else if (flag>20)
        printf("空间不足");
    //未使用//
 
printf("输入-1返回主菜单\n");
scanf("%d",&j);
if (j==-1)
menu();
}


void chakan()//查看已录入书籍
{    
    int i,j=0;
        FILE *fp1;//存书的信息指针
        fp1=fopen("book1.txt","rt");//只读
        if(fp1==NULL)
        {
            printf("\n不能打开book1.txt");
            getch();
            exit(1);
        }
        
i=0;
    
do{            fscanf(fp1,"%s %s %f %d %d %d %d %d",b[i].name,b[i].name2,b[i].money,b[i].num,b[i].many,b[i].Rdate.year,b[i].Rdate.month,b[i].Rdate.day);    
            printf("书名:%s\n",b[i].name);
            printf("作者:%s\n",b[i].name2);
            printf("价格:%f\n",b[i].money);
            printf("编号:%d\n",b[i].num);
            printf("数量:%d\n",b[i].many);
            printf("录入日期:%d年%d月%d日\n",b[i].Rdate.year,b[i].Rdate.month,b[i].Rdate.day);    
            i++;
    
            }while(fscanf(fp1,"%s %s %f %d %d %d %d %d",b[i].name,b[i].name2,b[i].money,b[i].num,b[i].many,b[i].Rdate.year,b[i].Rdate.month,b[i].Rdate.day)!=EOF);
    
                fclose(fp1);


    printf("输入-1返回主菜单\n");
    scanf("%d",&j);
    if (j==-1)
        menu();
}



void jieyue()
{
printf("");
}



void guihuan()
{
printf("");
}



void shanchu()
{
printf("");
}


void chazhao()//查找书籍
{    int i,j,a;
    printf("请输入书籍编号:");
    scanf("%d",&a);
    for (i=1;i<=20;i++)
    {
        if (a==b[i].num)
            printf("已查询到书籍信息\n");
            printf("所查书籍信息为:\n");
            printf("书名:%s\n",b[i].name);
            printf("作者:%s\n",b[i].name2);
            printf("价格:%f\n",b[i].money);
            printf("编号:%d\n",b[i].num);
            printf("数量:%d\n",b[i].many);
            printf("录入日期:%s\n",b[i].Rdate);

    }
    printf("输入-1返回主菜单\n");
    scanf("%d",&j);
    if (j==-1)
        menu();
}


 int main()//主程序
{    
     menu();    
     return 0;
}



运行结果及报错内容 :exe已停止运行
我的解答思路和尝试过的方法 :都试了没用
我想要达到的结果:能不能帮我改进一下代码

fscanf读取整型、浮点型数据时,要对变量名加&,进行取地址

尝试debug定位问题所在

修改如下,供参考:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int  main();
void luru();
void chakan();
void jieyue();
void guihuan();
void chazhao();
void shanchu();
void cun()//文件
{
    FILE* fp;
    fp = fopen("book1.txt", "wt");
    if (fp == NULL)
    {
        printf("\n不能打开book.txt");
        getch();
        exit(1);
    }
}
struct date
{
    int year;
    int month;
    int day;
};
struct  book//结构体写书的信息
{
    char name[21];//书名
    char name2[21];//作者
    float money;//价格
    int num;//书的编号
    int many;//数量
    struct date Rdate;//书的录入日期

};
struct book b[20];//结构体变量
void menu()//菜单
{
    printf("=====================================\n");
    printf(" 【******欢迎使用图书管理系统******】\n");
    printf("‖系统菜单:                        ‖\n");
    printf("‖1.录入新书籍(首次使用)            ‖\n");
    printf("‖2.查看已录入书籍                  ‖\n");
    printf("‖3.借阅书籍                        ‖\n");
    printf("‖4.归还书籍                        ‖\n");
    printf("‖5.删除已录入书籍                  ‖\n");
    printf("‖6.查找书籍                        ‖\n");
    printf("‖0.退出系统                        ‖\n");
    printf("=====================================\n");
    printf("请输入序号:\n");
    int a;
    scanf("%d", &a);//输入序号
    switch (a)//选择序号
    {
    case 1:luru(); break;
    case 2:chakan(); break;
    case 3:jieyue(); break;
    case 4:guihuan(); break;
    case 6:chazhao(); break;
    case 5:shanchu(); break;
    case 0:printf("按任意键退出系统!"); break;
    default: printf("未输入正确序号"); break;
    }
}

void luru()//录入函数
{
    int n1, i, j, k;
    int flag = 0;

    FILE* fp1;//存书的信息指针
    fp1 = fopen("book1.txt", "wt");//只写
    if (fp1 == NULL)
    {
        printf("\n不能打开book1.txt");
        getch();
        exit(1);
    }
    FILE* fpi;//存下标指针
    fpi = fopen("i.txt", "wt");//只写
    if (fpi == NULL)
    {
        printf("\n不能打开i.txt");
        getch();
        exit(1);
    }
    FILE* fpf;//存标识符指针
    fpf = fopen("flag1.txt", "wt");//只写
    if (fpf == NULL)
    {
        printf("\n不能打开flag1.txt");
        getch();
        exit(1);
    }
    if (fscanf(fpf, "%d", &flag) == EOF)  //if (fscanf(fpf, "%d", flag) == EOF)
        flag = 0;
    else flag = fscanf(fpf, "%d", &flag);// ? flag = fscanf(fpf, "%d", flag);

    if (flag == 0)
    {
        printf("请输入录入书籍的个数(<=20):\n");
        scanf("%d", &n1);

        for (i = 0; i < n1; i++)
        {
            printf("当前正在录入第%d种书\n", i + 1);
            printf("请输入书名:\n");
            scanf("%s", b[i].name); //scanf("%s", &b[i].name);
            getchar();
            printf("请输入作者:\n");
            scanf("%s", b[i].name2); //scanf("%s", &b[i].name2);
            getchar();
            printf("请输入价格(可用小数):\n");
            scanf("%f", &b[i].money);
            getchar();
            printf("请输入编号:\n");
            scanf("%d", &b[i].num);
            getchar();
            printf("请输入入库数量:\n");
            scanf("%d", &b[i].many);
            getchar();
            printf("请输入录入日期(年(空格)月(空格)日):\n");
            scanf("%d %d %d", &b[i].Rdate.year, &b[i].Rdate.month, &b[i].Rdate.day);

            fprintf(fp1, "%s %s %f %d %d %d %d %d\n", b[i].name, b[i].name2, b[i].money, 
                b[i].num, b[i].many, b[i].Rdate.year, b[i].Rdate.month, b[i].Rdate.day);//存书籍信息
            flag = flag + 1;
        }
        fprintf(fpi, "%d", i);
        fprintf(fpf, "%d", flag);//存标识符
        fclose(fp1);
        fclose(fpi);
        fclose(fpf);
    }
    //未使用//
    else if (flag > 0 && flag < 20 - flag) //if (flag > 0 && flag <= 20 - flag)
    {

        printf("请输入新录入书籍的个数:\n");
        scanf("%d", &k);
        for (flag; flag <= k + flag; flag++)
        {
            printf("请输入书名:\n");
            scanf("%s", b[flag].name); //scanf("%s", &b[flag].name);
            getchar();
            printf("请输入作者:\n");
            scanf("%s", b[flag].name2); //scanf("%s", &b[flag].name2);
            getchar();
            printf("请输入价格:\n");
            scanf("%f", &b[flag].money);
            getchar();
            printf("请输入编号:\n");
            scanf("%d", &b[flag].num);
            getchar();
            printf("请输入入库数量:\n");
            scanf("%d", &b[flag].many);
            getchar();
            printf("请输入录入日期:\n");
            scanf("%d %d %d", &b[flag].Rdate.year, &b[flag].Rdate.month, &b[flag].Rdate.day);
        }
    }
    else if (flag > 20)
        printf("空间不足");
    //未使用//

    printf("输入-1返回主菜单\n");
    scanf("%d", &j);
    if (j == -1)
        menu();
}
void chakan()//查看已录入书籍
{
    int i, j = 0;
    FILE* fp1;//存书的信息指针
    fp1 = fopen("book1.txt", "rt");//只读
    if (fp1 == NULL)
    {
        printf("\n不能打开book1.txt");
        getch();
        exit(1);
    }
    i = 0;
    while(1) {   //修改
        if (fscanf(fp1, "%s %s %f %d %d %d %d %d", b[i].name, b[i].name2, &b[i].money,
            &b[i].num, &b[i].many, &b[i].Rdate.year, &b[i].Rdate.month, &b[i].Rdate.day) != 8) break; //修改
        printf("书名:%s\n", b[i].name);
        printf("作者:%s\n", b[i].name2);
        printf("价格:%f\n", b[i].money);
        printf("编号:%d\n", b[i].num);
        printf("数量:%d\n", b[i].many);
        printf("录入日期:%d年%d月%d日\n", b[i].Rdate.year, b[i].Rdate.month, b[i].Rdate.day);
        i++;
    } 
    //while (fscanf(fp1, "%s %s %f %d %d %d %d %d", b[i].name, b[i].name2, b[i].money, b[i].num,      修改
                            //b[i].many, b[i].Rdate.year, b[i].Rdate.month, b[i].Rdate.day) != EOF);

    fclose(fp1);
    printf("输入-1返回主菜单\n");
    scanf("%d", &j);
    if (j == -1)
        menu();
}
void jieyue()
{
    printf("");
}
void guihuan()
{
    printf("");
}
void shanchu()
{
    printf("");
}
void chazhao()//查找书籍
{
    int i, j, a;
    printf("请输入书籍编号:");
    scanf("%d", &a);
    for (i = 0; i < 20; i++) //for (i = 1; i <= 20; i++)
    {
        if (a == b[i].num) { //修改
            printf("已查询到书籍信息\n");
            printf("所查书籍信息为:\n");
            printf("书名:%s\n", b[i].name);
            printf("作者:%s\n", b[i].name2);
            printf("价格:%f\n", b[i].money);
            printf("编号:%d\n", b[i].num);
            printf("数量:%d\n", b[i].many);
            printf("录入日期:%d年%d月%d日\n", b[i].Rdate.year, b[i].Rdate.month, b[i].Rdate.day);
            //printf("录入日期:%s\n", b[i].Rdate); 修改
            break;   //修改
        }//修改
    }
    if (i >= 20)
        printf("未查询到书籍信息\n");
    printf("输入-1返回主菜单\n");
    scanf("%d", &j);
    if (j == -1)
        menu();
}
int main()//主程序
{
    menu();
    return 0;
}