c语言,如图出现下列问题,请问怎么解决

img

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct book *creatBookLinkList();         //创建链表(初始化图书信息)
void writeToFile1(struct book *phead);    //把图书数据写到文件,以只写的方式打开 
void writeToFile2(struct user *phead);    //把用户数据写入文件 
struct book *outToLinklist1();     //把图书数据读出到链表  
struct user *outToLinklist2();     //把用户数据读出到链表 
//oper=1 根据ISBN查找,进行采编入库 
//oper=-1 根据IBSN查找,进行借阅
//oper=2 根据IBSN查找,进行归还 
int find(struct book *phead, char *ISBN, int oper); 

//采编入库:1、读出链表  2、插入节点  3、存入文件 
void in();

//借阅:1、把图书数据读出到l两个链表链表 
//      2、按照ISBN查找书籍,现存量>0,现存量--,创建借阅者信息;否则提示无法借阅
//        3、把图书链表和借阅者分别写入两个文件  
//void userInit(struct user *phead); 
void borrow();

//归还:1、把借阅者信息和图书信息读出链表
//      2、按照ISBN查找图书信息,并更新now++ 
//      3、删除借阅者id信息对应的借阅信息 
//      5、把图书链表和借阅者分别写入两个文件
void returnBook();
void delete_user(struct user *phead, char *id, char *ISBN);

FILE *fp;

//图书结构体 
struct book {
    char ISBN[15];           //书号 
    char book_name[30];      //书名 
    char auther_name[20];    //著作者
    int now;            //现存量 
    int inventory;      //库存量 
    struct book *next;
}; 

struct user {
    char id[10];      //借阅者id
    char ISBN[15];    //借阅的图书编号 
    char date[10];    //格式为XXXX-XX-XX 
    struct user *next;
};


main() {
    int num;

while(1) {

printf("\n\n\n\n\n\n\n\n\n\n\t\t\t\t              1.初始化图书信息\n");
printf("\t\t\t\t              2.采编入册\n");
printf("\t\t\t\t              3.借阅\n");
printf("\t\t\t\t              4.归还\n");
printf("\t\t\t\t              0.退出系统\n"); 
printf("\t\t\t\t              请选择:");
scanf("%d",&num);

switch(num){
    case 1:
    
        creatBookLinkList();
        break;
    case 2: 

        in(); 
        break;
    case 3:

        if(fopen("D:\\book.txt","r") == NULL ||feof(fopen("D:\\book.txt","r")))
            printf("图书馆暂未来购入!");
        else 
            borrow();
        break;
    case 4:

        returnBook();
        break;
    case 0:

        exit(1);
    default:
        printf("\t\t\t\t              输入号码不合法!(按Enter返回)\n");
        getchar();getchar();break;    
    }
}

```

}

//初始化带头节点的链表
struct book *creatBookLinkList() {
char a[2];
printf("请录入需要采编入库的书籍信息:\n");
struct book *phead,pnew,pend;
pend=phead=(struct book
)malloc(sizeof(struct book));
char ISBN[15];
char book_name[30];
char auther_name[20];
int inventory;
while(1)
{
pnew=(struct book
)malloc(sizeof(struct book));
if(pnew!=NULL)
{
printf("请输入书号(ISBN):");
gets(pnew->ISBN);getchar();
printf("请输入书名:");
gets(pnew->book_name);getchar();
printf("请输入作者名:");
gets(pnew->auther_name);getchar();
printf("请输入库存量:");
scanf("%d", &pnew->inventory);
pnew->now = pnew->inventory; //初始情况下,现存=库存
pnew->next=NULL;
pend->next=pnew;
pend=pend->next;
printf("是否结束录入(Y/y结束):");
getchar();
gets(a);
if(strcmp(a,"y")==0 || strcmp(a,"Y")==0)
break;
}
}
writeToFile1(phead);
return phead;
}

//图书信息存入文件
void writeToFile1(struct book *phead) {
FILE *fp1;
struct book *ptemp;
fp1=fopen("D:\book.txt","w");
if(fp1!=NULL) {
ptemp=phead->next;
while(ptemp!=NULL)
{
fprintf(fp1,"%s %s %s %d %d\n",ptemp->ISBN,ptemp->book_name,ptemp->auther_name,ptemp->now,ptemp->inventory);
ptemp=ptemp->next;
}
} else {
printf("创建文件失败!\n");
exit(1);
}
fclose(fp1);
}

//借阅者信息存入文件
void writeToFile2(struct user *phead) {
FILE *fp2;
struct user *ptemp;
fp2=fopen("D:\user.txt","w");
if(fp2!=NULL) {
ptemp=phead->next;
while(ptemp!=NULL) {
fprintf(fp2,"%s %s %s\n",ptemp->id,ptemp->ISBN,ptemp->date);
ptemp=ptemp->next;
}
} else {
printf("创建文件失败\n");
exit(1);
}
fclose(fp2);
}

//把数据读出到链表
struct book *outToLinklist1()
{
FILE *fp;
fp=fopen("D:\book.txt","r");
if(fp!=NULL)
{
struct book *phead=NULL,pnew,pend;
phead=(struct book
)malloc(sizeof(struct book));
pend=phead;
while(1)
{
pnew=(struct book
)malloc(sizeof(struct book));
if(pnew!=NULL)
{
if(!feof(fp))
{
fscanf(fp,"%s %s %s %d %d \n ",&pnew->ISBN,pnew->book_name,pnew->auther_name,&pnew->now,&pnew->inventory);
pnew->next=NULL;
pend->next=pnew;
pend=pend->next;
}
else break;
}
}
fclose(fp);
return phead;
}
}

struct user *outToLinklist2() {
FILE *fp;
fp=fopen("D:\user.txt","r");
if(fp!=NULL) {
struct user *phead=NULL,pnew,pend;
phead=(struct user
)malloc(sizeof(struct user));
pend=phead;
while(1) {
pnew=(struct user
)malloc(sizeof(struct user));
if(pnew!=NULL) {
if(!feof(fp)) {
fscanf(fp,"%s %s %s\n ",pnew->id,pnew->ISBN,pnew->date);
pnew->next=NULL;
pend->next=pnew;
pend=pend->next;
}
else break;
}
}
fclose(fp);
return phead;
}
}

// 按ISBN查找并修改 oper==1是采编入库 ,oper==-1 是借阅 ,oper==2是归还
int find(struct book *phead, char *ISBN, int oper) {
if(phead->next==NULL) {
printf("phead->next==NULL\n");
return -1;
}
struct book *pre=phead->next;
while(pre!=NULL) {
//找到ISBN图书
if(strcmp(pre->ISBN, ISBN) == 0) {
if(oper == 1){
pre->now++;
pre->inventory++;
}
if(oper == -1) {
if(pre->now > 0){
pre->now--;
}
else
return -1;
}
if(oper == 2)
pre->now++;
writeToFile1(phead);
return 0;
}
pre = pre->next;
}
if(pre == NULL)
return -1;
}

//采编入库
void in() {
struct book *phead;
if(fopen("D:\book.txt","r")==NULL) {
printf("采编入库---book文件不存在\n");
struct book pend;
phead=(struct book
)malloc(sizeof(struct book));
}
else{
phead = outToLinklist1();
}
char a[2];
char ISBN[15];
while(1) {
printf("请输入要采编入册的图书信息:\n");
printf("请输入书号(ISBN):");
char ISBN[15];
gets(ISBN);
//如果没有找到
if(find(phead, ISBN, 1) == -1) {
char book_name[30];
char auther_name[20];
struct book pnew = (struct book)malloc(sizeof(struct book));
printf("请输入书名:");
gets(book_name);
printf("请输入作者名:");
gets(auther_name);
strcpy(pnew->ISBN, ISBN);
strcpy(pnew->book_name, book_name);
strcpy(pnew->auther_name, auther_name);
pnew->now = pnew->inventory = 1;
//新建节点插入phead之后
pnew->next = phead->next;
phead->next = pnew;
} else {
printf("库存中已有%s书\n",ISBN);
}
printf("是否结束采编入库(Y/y结束):");
gets(a);
if(strcmp(a,"y")==0 || strcmp(a,"Y")==0)
break;
}
writeToFile1(phead);
}
// 初始化借阅者
//void userInit(struct user *phead) {
// struct user *phead, pend;
// pend=phead=(struct user
)malloc(sizeof(struct user));
// writeToFile2(phead);
//}

//借阅
void borrow() {
char ISBN[15];
struct book *phead1 = outToLinklist1();
struct user phead2;
char a[2];
while(1) {
printf("请输入借阅书籍ISBN:");
gets(ISBN);
if(find(phead1, ISBN, -1) == -1)
printf("不存在ISBN为%s的书籍或该书籍已无余量\n",ISBN);
else {
if(fopen("D:\user.txt","r") != 0) {
phead2 = outToLinklist2();
printf("有user.txt\n") ;
}
else {
printf("mei...有user.txt\n") ;
phead2 = (struct user
)malloc(sizeof(struct user));
phead2->next = NULL;
}
struct user pnew = (struct user)malloc(sizeof(struct user));
char id[10]; //借阅者id
char date[10]; //格式为XXXX-XX-XX
strcpy(pnew->ISBN,ISBN);
printf("请输入借阅者id:");
gets(pnew->id);
printf("请输入归还日期(XXXX-XX-XX):");
gets(pnew->date);
pnew->next = phead2->next;
phead2->next = pnew;
writeToFile2(phead2);
printf("是否结束借阅(Y/y结束):");
gets(a);
if(strcmp(a,"y")==0 || strcmp(a,"Y")==0)
break;
}
}
}

//归还
void returnBook()
{
char ISBN[15];
char id[10];
struct book *phead1 = outToLinklist1();
struct user *phead2 = outToLinklist2();
printf("请输入被归还图书ISBN:");
gets(ISBN);
printf("请输入归还者id:");
gets(id);
int result = find(phead1, ISBN, 2);
if(result == 0) {
delete_user(phead2, id, ISBN);
writeToFile2(phead2);
} else {
printf("归还失败!\n");
}
writeToFile1(phead1);
}

void delete_user(struct user *phead, char *id, char *ISBN) {
struct user *ptemp, *pfront; //ptemp是临时指针,pfront是被删除结点的前驱
ptemp = phead;
pfront = ptemp;
while(ptemp!=NULL) {
if(strcmp(ptemp->ISBN,ISBN)==0 && strcmp(ptemp->id,id)==0) {
pfront->next=ptemp->next;
free(ptemp);
printf("归还成功!\n");
getchar();
break;
}
pfront=ptemp;
ptemp=ptemp->next;
}

}

```这是完整代码,如果可以的话看看我哪里还有需要优化的地方?

gets输入字符串,后面的getchar()删掉看看