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);
void printUser();
void printBook();
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");
    printf("*****************************************************************\n");
    printf("*\t\t\t欢迎使用学生管理系统\t\t\t*\n");
    printf("*****************************************************************\n");
    printf("*\t\t\t1.初始化图书信息\t\t\t*\n");
    printf("*\t\t\t2.采编入册\t\t\t\t*\n");
    printf("*\t\t\t3.借阅\t\t\t\t\t*\n");
    printf("*\t\t\t4.归还\t\t\t\t\t*\n");
    printf("*\t\t\t5.输出借阅者信息\t\t\t*\n");
    printf("*\t\t\t6.输出图书信息\t\t\t\t*\n");
    printf("*\t\t\t0.退出系统\t\t\t\t*\n"); 
    printf("*****************************************************************\n");
    printf("\t\t\t请选择:");
    scanf("%d",&num);
    switch(num){
        case 1:
            system("cls");
            creatBookLinkList();
            break;
        case 2: 
            system("cls");
            in(); 
            break;
        case 3:
            system("cls");
            if(fopen("D:\\book.txt","r") == NULL ||feof(fopen("D:\\book.txt","r")))
                printf("图书馆暂未来购入!");
            else 
                borrow();
            break;
        case 4:
            system("cls");
            returnBook();
            break;
        case 5:
            system("cls");
            printUser();break;
        case 6:
            system("cls"); 
            printBook();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));   // 创建带头节点的链表,同时让pend和phead指向头节点
    while (1) {
        pnew = (struct book*)malloc(sizeof(struct book));   // 动态分配一个新节点
        if (pnew != NULL) {
            printf("请输入书号(ISBN):");
            scanf("%s", pnew->ISBN);   // 使用scanf函数输入字符串
            getchar();   // 处理scanf函数留下的换行符
            printf("请输入书名:"); 
            scanf("%s", pnew->book_name);
            getchar();
            printf("请输入作者名:");
            scanf("%s", pnew->auther_name);
            getchar();
            printf("请输入库存量:");
            scanf("%d", &pnew->inventory);
            getchar();
            pnew->now = pnew->inventory;   // 初始情况下,现存=库存 
            pnew->next = NULL;
            pend->next = pnew;   // 将新节点插入链表末尾
            pend = pend->next;
            printf("是否结束录入(Y/y结束):");
            scanf("%s", a);
            getchar();
            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):");
        scanf("%s", ISBN); // 使用scanf函数读取用户输入的书号
        getchar(); // 读取并丢弃换行符
        //如果没有找到 
        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); // 使用gets函数读取用户输入的书名
            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 borrow() {
    char ISBN[15];
    struct book *phead1 = outToLinklist1();
    struct user *phead2; 
    char a[2];
    while(1) {
        printf("请输入借阅书籍ISBN:");
        scanf("%s", ISBN);
        getchar(); // 清空输入缓冲区
        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("没有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:");
    scanf("%s", ISBN);
    getchar(); // 清空输入缓冲区
    printf("请输入归还者id:");
    scanf("%s", id);
    getchar(); // 清空输入缓冲区
    if(find(phead1, ISBN, 2) == 0) {
        delete_user(phead2, id, ISBN);
    } else {
        printf("归还失败!\n");
    }
    writeToFile1(phead1);   
    writeToFile2(phead2);
}
void delete_user(struct user *phead, char *id, char *ISBN) {
    struct user *ptemp, *pfront;           //ptemp是临时指针,pfront是被删除结点的前驱
    ptemp = phead->next;
    pfront = phead;
    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;
    }
}
// 输出借阅者信息
void printUser() {
    struct user *phead = outToLinklist2();
    struct user *ptemp = phead->next;
    printf("借阅者id\t借阅的图书编号\t归还日期\n");
    while(ptemp != NULL) {
        printf("%s\t\t%s\t\t%s\n", ptemp->id, ptemp->ISBN, ptemp->date);
        ptemp = ptemp->next;
    }
}
// 输出图书信息
void printBook() {
    struct book *phead = outToLinklist1();
    struct book *ptemp = phead->next;
    printf("书号\t\t书名\t\t作者名\t\t现存量\t\t库存量\n");
    while(ptemp != NULL) {
        printf("%-15s%-18s%-18s%-15d%d\n", ptemp->ISBN, ptemp->book_name, ptemp->auther_name, ptemp->now, ptemp->inventory);
        ptemp = ptemp->next;
    }
}

struct book *creatBookLinkList(); 创建链表(初始化图书信息函数 和 void in(); 采编入库函数,两个函数在最后写入文件即调用writeToFile1(phead);会有相互覆盖内容的问题,未作修改。其它问题,修改如下,改动处见注释处,供参考:

#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);
void printUser();
void printBook();
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[12];    //格式为XXXX-XX-XX 
    struct user *next;
};
main() {
    int num;
    while(1) {
    printf("\n\n\n\n");
    printf("*****************************************************************\n");
    printf("*\t\t\t欢迎使用学生管理系统\t\t\t*\n");
    printf("*****************************************************************\n");
    printf("*\t\t\t1.初始化图书信息\t\t\t*\n");
    printf("*\t\t\t2.采编入册\t\t\t\t*\n");
    printf("*\t\t\t3.借阅\t\t\t\t\t*\n");
    printf("*\t\t\t4.归还\t\t\t\t\t*\n");
    printf("*\t\t\t5.输出借阅者信息\t\t\t*\n");
    printf("*\t\t\t6.输出图书信息\t\t\t\t*\n");
    printf("*\t\t\t0.退出系统\t\t\t\t*\n"); 
    printf("*****************************************************************\n");
    printf("\t\t\t请选择:");
    scanf("%d",&num);
    switch(num){
        case 1:
            system("cls");
            creatBookLinkList();
            break;
        case 2:
            system("cls");
            in(); 
            break;
        case 3:
            system("cls");
            if(fopen("D:\\book.txt","r") == NULL ||feof(fopen("D:\\book.txt","r")))
                printf("图书馆暂未来购入!");
            else 
                borrow();
            break;
        case 4:
            system("cls");
            returnBook();
            break;
        case 5:
            system("cls");
            printUser();break;
        case 6:
            system("cls"); 
            printBook();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));// 创建带头节点的链表,同时让pend和phead指向头节点
    while (1) {
        pnew = (struct book*)malloc(sizeof(struct book));   // 动态分配一个新节点
        if (pnew != NULL) {
            printf("请输入书号(ISBN):");
            scanf("%s", pnew->ISBN);   // 使用scanf函数输入字符串
            getchar();   // 处理scanf函数留下的换行符
            printf("请输入书名:"); 
            scanf("%s", pnew->book_name);
            getchar();
            printf("请输入作者名:");
            scanf("%s", pnew->auther_name);
            getchar();
            printf("请输入库存量:");
            scanf("%d", &pnew->inventory);
            getchar();
            pnew->now = pnew->inventory;   // 初始情况下,现存=库存
            pnew->next = NULL;
            pend->next = pnew;   // 将新节点插入链表末尾
            pend = pend->next;
            printf("是否结束录入(Y/y结束):");
            scanf("%s", a);
            getchar();
            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);
                    //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 {
                    free(pnew);  // 修改
                    break;
                }
            }
        }
        fclose(fp);
        return phead;
    }
    return NULL;    // 修改
}
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;
    }
    return NULL;   // 修改
}
// 按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() {
    FILE *fp;                                      // 修改
    struct book *phead;
    if((fp = fopen("D:\\book.txt","r")) == NULL) { // 修改
        printf("采编入库---book文件不存在\n");
         //struct book *pend;                        修改
        phead=(struct book*)malloc(sizeof(struct book));
    }
    else{
        fclose(fp);                                // 修改
        phead = outToLinklist1();
    }
    char a[2]; 
    char ISBN[15];
    while(1) {
        printf("请输入要采编入册的图书信息:\n");
        printf("请输入书号(ISBN):");
        scanf("%s", ISBN); // 使用scanf函数读取用户输入的书号
        getchar(); // 读取并丢弃换行符
        //如果没有找到 
        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); // 使用gets函数读取用户输入的书名
            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 borrow() {
    char ISBN[15];
    struct book *phead1 = outToLinklist1();
    struct user *phead2; 
    char a[2];
    while(1) {
        printf("请输入借阅书籍ISBN:");
        scanf("%s", ISBN);
        getchar(); // 清空输入缓冲区
        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("没有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:");
    scanf("%s", ISBN);
    getchar(); // 清空输入缓冲区
    printf("请输入归还者id:");
    scanf("%s", id);
    getchar(); // 清空输入缓冲区
    if(find(phead1, ISBN, 2) == 0) {
        delete_user(phead2, id, ISBN);
    } else {
        printf("归还失败!\n");
    }
    writeToFile1(phead1);   
    writeToFile2(phead2);
}
void delete_user(struct user *phead, char *id, char *ISBN) {
    struct user *ptemp, *pfront; //ptemp是临时指针,pfront是被删除结点的前驱
    ptemp = phead->next;
    pfront = phead;
    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;
    }
}
// 输出借阅者信息
void printUser() {
    struct user *phead = outToLinklist2();
    if (!phead) { printf("NULL\n");  return; } // 修改
    struct user *ptemp = phead->next;
    printf("借阅者id\t借阅的图书编号\t归还日期\n");
    while(ptemp != NULL) {
        printf("%s\t\t%s\t\t%s\n", ptemp->id, ptemp->ISBN, ptemp->date);
        ptemp = ptemp->next;
    }
}
// 输出图书信息
void printBook() {
    struct book *phead = outToLinklist1();
    if (!phead) { printf("NULL\n");  return; }  // 修改
    struct book *ptemp = phead->next;
    printf("书号\t\t书名\t\t作者名\t\t现存量\t\t库存量\n");
    while(ptemp != NULL) {
        printf("%-15s%-18s%-18s%-15d%d\n", ptemp->ISBN, ptemp->book_name,
                        ptemp->auther_name, ptemp->now, ptemp->inventory);
        ptemp = ptemp->next;
    }
}

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7419104
  • 你也可以参考下这篇文章:C语言与文件输入输出
  • 你还可以看下c语言参考手册中的 c语言-内存模型与数据竞争
  • 除此之外, 这篇博客: C语言进阶之路:输出任意两个数的和中的 总结 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 这里对文章进行总结:
    以上就是今天要讲的内容,本文仅仅简单介绍了对任意两个整数的简单求和;有关对任意整数的加减乘除问题,请读者自己认真仔细思考,或者详见笔者下篇博客内容

  • 您还可以看一下 李飞老师的C语言开发之数据结构与算法一课程中的 小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    针对该问题,我需要看一下代码和数据文件才能更好地理解问题。但根据经验来看,可能的原因是读取文件时没有按正确方式读取,导致读取出来的内容有误。如果是这样,可以尝试使用二进制方式读取文件流,读取正确的数据大小并分配正确的内存空间来保证数据的正确性。如果您能提供代码和数据文件,我可以更好地帮助您解决问题。

越界了,读取了不该读取的内存,检查下下标