C语言程序设计:图书管理系统(超详细有登录系统,附代码和实验报告)

C语言程序设计:图书管理系统(超详细有登录系统,附代码和实验报告)C 课程设计 图书管理系统 1 题目意义图书馆 作为文献的聚集地和展示平台 常常扮演着引领文化前进的角色 是每个大学不可或缺的基础设施 而图书管理系统则是一个图书馆能够正常运转的关键 本次课程设计使用 C 语言制作程序来实现图书的登记 删除 查询 浏览以及读者的借阅 还书 会员登录 修改密码等功能 程序中涉及到数据链表和文件指针的操作 包括结构体数据定义 使用及文件的读写 定位 修改等 2 设计思

C课程设计——图书管理系统

1、题目意义

图书馆,作为文献的聚集地和展示平台,常常扮演着引领文化前进的角色,是每个大学不可或缺的基础设施,而图书管理系统则是一个图书馆能够正常运转的关键。本次课程设计使用C语言制作程序来实现图书的登记,删除,查询,浏览以及读者的借阅,还书,会员登录,修改密码等功能。程序中涉及到数据链表和文件指针的操作,包括结构体数据定义,使用及文件的读写,定位,修改等。

2、设计思想

3.总设计框架图

在这里插入图片描述

4.代码展示

在这里插入图片描述
在这里插入图片描述

#include 
  
    #include 
   
     //其中包含system函数 #include 
    
      //定义了通过控制台进行 数据输入 和数据输出的函数,如getch函数。 #include 
     
       //定义字符数组 #include 
      
        #define LEN sizeof(struct book)//有关图书信息的结构体 #define LEN1 sizeof(struct reader)//有关读者信息的结构体 #define LEN2 sizeof(struct land)//有关登录系统的结构体 struct book//图书信息 { char num[20],nam[20],aut[20],pub[20],cat[20]; int many; float price; struct book*next; }; struct reader//读者借阅信息 { int jnum; char jnam[20],time[20],tsnam[20]; struct reader *next; }; struct land//登录信息 { int zhanghao; char password[20]; struct land*next; }; int tjzs();//统计library文本个数函数 void xg(int,char[] ); void mainmenu();//显示主菜单 void tsmenu();//显示图书信息菜单 void jmenu();//显示借阅信息菜单 void lmenu();//显示登录菜单 void main1();// 主菜单功能 void tsmain();//图书菜单功能 void cxts();//查询图书 void zjts();//增加图书 void scts();//删除图书 void llts();//浏览图书 void jmain();//读者借阅信息 void js();//借书 void hs();//还书 void cxjs();//查询借书 void lljs();// 浏览借书情况 void land();//登录功能系统 int xinjian(int,char[] );//创建账号密码 void xgmm();//修改密码 void lmain();//登录界面函数 int tjzs()//统计图书文本个数 { FILE *fp; int txcl=0,n; float tprice=0; char tname[20]={'\0'},tauthor[20]={'\0'},tchuban[20]={'\0'},tkind[20]={'\0'},tshuhao[20]={'\0'}; fp=fopen("library.txt","r");//打开文件 for (n=0;!feof(fp);n++)//逐个读文件 fscanf(fp,"%s%s%s%s%s%d%f",tshuhao,tname,tauthor,tchuban,tkind,&txcl,&tprice); n--; fclose(fp);//关闭文件 return (n);//返回个数 } int tjdzzs()//统计文读者本个数函数 { FILE *fp; int zhenghao=0,n; char mingzi[20]={'\0'},riqi[20]={'\0'},zname[20]={'\0'}; fp=fopen("reader.txt","r");//打开文件 for (n=0;!feof(fp);n++)//逐个读文件 fscanf(fp,"%d%s%s%s ",&zhenghao,&mingzi,&riqi,&zname); n--; fclose(fp);//关闭文件 return (n);//返回个数 } int tjzs3()//统计账号密码文本个数 { FILE *fp; int zhao=0,n; char mm[20]={'\0'}; fp=fopen("land.txt","r");//打开文件 for (n=0;!feof(fp);n++)//逐个读文件 fscanf(fp,"%d %s",&zhao,mm); n--; fclose(fp);//关闭文件 return (n);//返回个数 } void mainmenu()//主菜单 { system ("cls"); printf(""); printf("\n\n 1.图书系统\n\n"); printf("\n\n 2.借阅系统\n\n"); printf("\n\n 3.退出系统\n\n"); printf("\n\n 请按键选择,回车确定\n"); printf("*\n"); return ; } void tsmenu() //图书馆信息菜单 { system ("cls"); printf(""); printf("\n 1.增加图书\n\n"); printf("\n 2.删除图书\n\n"); printf("\n 3.查询图书\n\n"); printf("\n 4.库存浏览\n\n"); printf("\n 5.返回上一层\n\n"); printf("\n 请按键选择,回车确定\n"); printf("*\n"); return ; } void main1() { void tsmian(); void jmain(); char choose; mainmenu(); scanf(" %c",&choose); switch(choose)//功能函数 { case'1': tsmain(); break; case'2': jmain(); break; case'3': system("cls"); getch(); exit(0); system ("cls"); break; } } void tsmain() { void zjts(); void scts(); void ctts(); void llts(); char choose; tsmenu(); scanf(" %c",&choose); for(;;) { switch(choose) { case'1': zjts(); break; case'2': scts(); break; case'3': cxts(); break; case'4': llts(); break; case'5': main1(); break; } } } void zjts()//增加图书 { FILE*fp; char i; int many=0; float price=0; char nam[20]={'\0'},aut[20]={'\0'},cat[20]={'\0'},pub[20]={'\0'},num[20]={'\0'}; system ("cls"); if ((fp=fopen("library.txt","r"))==NULL)//if语句:打开图书馆文件,不存在此文件则新建 { fp=fopen("library.txt","w"); fclose(fp); } fp=fopen("library.txt","a"); printf("\n请按以下格式输入图书信息:\n书号 书名 作者 出版社 类别 进库量 单价"); for(;i!=27;)//为了实现输入一次后按esc退出 { printf("请输入:\n"); scanf("%s%s%s%s%s%d%f",num,nam,aut,pub,cat,&many,&price); fprintf(fp,"%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",num,nam,aut,pub,cat,many,price); printf("继续输入请按回车,结束输入请按Esc\n"); i=getch();//暂停程序当i接收后继续下一条指令 for (;i!=13&&i!=27;)//保证只能是CR和ESC才能退出循环,输入其他字符无用,暂停程序,按'CR'继续。 i=getch(); } fclose(fp); printf("\n保存成功,按任意键返回上一层!"); getch(); tsmain();//返回上一层 } void scts()//删除图书 { struct book *head=NULL; struct book *p,*p1,*p2; int tmany=0,n=0,j,k; float tprice=0; char tnam[20]={'\0'},taut[20]={'\0'},tcat[20]={'\0'},tpub[20]={'\0'},tnum[20]={'\0'}; char jjnam[20]={'\0'}; char i; FILE *fp; if ((fp=fopen("library.txt","r"))==NULL)//打开文件 { system ("cls"); printf("\n记录文件不存在!按任意键返回"); getch(); tsmain(); } else//实现删除的功能 { system ("cls"); printf("\n请输入你要删除的书名:");//输入删除图书书名 scanf("%s",jjnam); printf("\n确认删除请回车,取消请按Esc\n"); i=getch(); for(;i!=13&&i!=27;) i=getch(); if (i==27) tsmain(); fp=fopen("library.txt","r"); j=tjzs(); for (k=0;k 
       
         next=p1; p2=p1; p1=(struct book*)malloc(LEN);//新建链表 } strcpy(p1->num,tnum);//复制书号 strcpy(p1->nam,tnam);//复制书名 strcpy(p1->aut,taut);//复制作者名字 strcpy(p1->pub,tpub);//复制出版社 strcpy(p1->cat,tcat);//复制类别 p1->many=tmany;//复制个数 p1->price=tprice;//复制单价 } } if (n==0)//如果图书只有一项且这一项刚好和要删除的相同 { head=NULL; } else//建立链表的最后剩余一个储存空间,所以封底 { p2->next=p1; p1->next=NULL; fclose(fp); } } fp=fopen("library.txt","w");//清空文件,只写打开,然后关闭 fclose(fp); fp=fopen("library.txt","a");//追加文件 p=head; for (;p!=NULL;)//把链表内容覆盖到文件 { fprintf(fp,"%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",p->num,p->nam,p->aut,p->pub,p->cat,p->many,p->price); p=p->next; } fclose(fp); system ("cls"); printf("\n删除成功 \n按任意键返回上一层\n"); getch();//返回上一层 tsmain(); } void cxts()//查询图书 { FILE *fp; int k=0,many=0,m=0,n=0; float price=0; char nam[20]={'\0'},aut[20]={'\0'},cat[20]={'\0'},pub[20]={'\0'},num[20]={'\0'}; char i; char chazhao[20]={'\0'}; if ((fp=fopen("library.txt","r"))==NULL)//打开文件 { system ("cls"); printf("\n记录文件不存在!按任意键返回"); getch(); tsmain(); } system("cls"); printf("请输入书号,书名,作者或类别查询:\n"); scanf("%s",chazhao); system ("cls"); m=tjzs(); for (n=0;n 
        
          next=p1; p2=p1; p1=(struct book*)malloc(LEN); } strcpy(p1->num,tshuhao);//复制书号 strcpy(p1->nam,tname);//复制书名 strcpy(p1->aut,tauthor);//复制作者 strcpy(p1->pub,tchuban);//复制出版社 strcpy(p1->cat,tkind);//复制类别 p1->many=many;//复制现存量 p1->price=tprice;//复制单价 } if(n==0) head=NULL; else { p2->next=p1; p1->next=NULL; fclose(fp); } } p=head; for (;p!=NULL;) { if(!(strcmp(p->nam,zname)))//判断要借书的是否存在,标记等于1,存在库存减一 { flag=1; loop=p->many; (p->many)--; } p=p->next; } if(flag&&(loop>0))//存在被借的图书且现存量大于0,把库存量变化后的链表存入文件 { fp=fopen("library.txt","w"); fclose(fp); fp=fopen("library.txt","a"); p=head; for(;p !=NULL;) { fprintf(fp,"%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",p->num,p->nam,p->aut,p->pub,p->cat,p->many,p->price); p=p->next; } free(p); fclose(fp); if ((fp3=fopen("reader.txt","r"))==NULL)//建读者文件夹存入借书信息 { fp3=fopen("reader.txt","w");//打开只读文件 fclose(fp3); } fp3=fopen("reader.txt","a"); printf("\n请按以下格式输入读者信息:\n 证号 姓名 借书日期 借书书名\n请输入:");//录入读者信息 scanf("%d %s %s %s",&jnum,mingzi,riqi,zname); fprintf(fp3,"\n%-8d%-23s%-18s%-10s\n",jnum,mingzi,riqi,zname); fclose(fp3); printf("借书成功!请两个月内归还!!!按任意键返回\n"); getch();//返回 jmain();//调用借阅系统 } else { if(flag!=0) printf("此书已被借完!按任意键返回!");//否则输出此书已被借完 else printf("查找无此书!按任意键返回"); } getch();//返回 jmain();//调用借阅系统 } void hs ()//还书函数 { FILE *fp,*fp3; struct reader *head=NULL; struct reader *p,*p1,*p2; struct book *lhead1=NULL; struct book *zp1,*lp1,*lp2; int txcl=0,i; float tprice=0; char tname[20]={'\0'},tauthor[20]={'\0'},tkind[20]={'\0'}, tchuban[20]={'\0'},ttname[20]={'\0'},tshuhao[20]={'\0'}; int ttzhenghao=0,tzhenghao=0,n=0,k=0,t=0,flag=0; char tmingzi[20]={'\0'},triqi[20]={'\0'},tzname[20]={'\0'},ttzname[20]={'\0'}; char hitkey=0; system ("cls"); { if ((fp=fopen("reader.txt","r"))==NULL)//不存在读者文件,则输出不能还书 { system ("cls"); printf("\n 不存在借书者!按任意键退出!"); getch(); system("cls"); jmain(); } else { 
         { printf("\n请输入读者证号和书名:\n请输入:"); scanf("%d %s",&ttzhenghao,ttzname);//输入还书证号和书名 k=tjdzzs();//获取读者文件夹信息个数 for (i=0;i 
         
           next=p1; p2=p1; p1=(struct reader*)malloc(LEN1);//新建链表 } p1->jnum=tzhenghao;//复制证号 strcpy(p1->jnam,tmingzi);//复制读者名字 strcpy(p1->time,triqi);//复制日 strcpy(p1->tsnam,tzname);//复制书名 }} if (n==0) head=NULL; else { p2->next=p1; p1->next=NULL; fclose(fp); } fp=fopen("reader.txt","w");//清空读者文件 fclose(fp); fp=fopen("reader.txt","a");//追加信息 p=head; for (;p!=NULL;)//把链表内容覆盖读者文件 { fprintf(fp,"\n%-8d%-23s%-18s%-10s\n",p->jnum,p->jnam,p->time,p->tsnam); p=p->next; } free(p); fclose(fp); }}}} if(flag)//标记为1,即还书时更改库存 { 
          { { printf("确认还书请按回车!"); for (;hitkey!=13&&hitkey!=27;) hitkey=getch(); if (hitkey==13) printf("成功!按任意键返回!"); n=0;flag=0; fp3=fopen("library.txt","r");//打开图书馆文件 k=tjzs();//获取图书馆文件个数 for (i=0;i 
          
            next=lp1; lp2=lp1; lp1=(struct book*)malloc(LEN);//新建链表 } strcpy(lp1->num,tshuhao);//复制书号 strcpy(lp1->nam,tname);//复制书名 strcpy(lp1->aut,tauthor);//复制作者 strcpy(lp1->pub,tchuban);//复制出版社 strcpy(lp1->cat,tkind);//复制类别 lp1->many=txcl; //复制现存量 lp1->price=tprice;//复制单价 } if (n==0) { lhead1=NULL; } else { lp2->next=lp1; lp1->next=NULL; fclose(fp3); }}} zp1=lhead1; for (;zp1!=NULL;) { if(!(strcmp(zp1->nam,ttzname)))//寻找书名相同 ++(zp1->many);//现存量加1 zp1=zp1->next; } fp3=fopen("library.txt","w");//清空图书馆文件 fclose(fp); fp3=fopen("library.txt","a");//追加信息 zp1=lhead1; for (;zp1!=NULL;)//把链表内容覆盖图书馆文件 { fprintf(fp3,"%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n", zp1->num,zp1->nam,zp1->aut,zp1->pub,zp1->cat,zp1->many,zp1->price); zp1=zp1->next; } fclose(fp3); getch();//返回 jmain();//调用借阅系统 } else printf("不存在此信息!按任意键返回!"); getch();//返回 jmain();//调用借阅系统 } void lljs()//显示借书情况函数 { FILE *fp; int zhenghao=0,xcl=0,n=0,i=0,j=0; char mingzi[20]={'\0'},riqi[20]={'\0'},zname[20]={'\0'}; if ((fp=fopen("reader.txt","r"))==NULL)//打开读者文件夹 { system ("cls"); printf("\n记录文件不存在!按任意键返回"); getch(); jmain(); } n=tjdzzs(); if (n==0) { system ("cls"); printf("\n无任何记录!"); } fp=fopen("reader.txt","r"); system ("cls"); printf("\n证号\t读者姓名\t\t借书日期\t书名\n"); for (;!feof(fp);)//输出文件信息 { fscanf(fp,"%d%s%s%s\n ",&zhenghao,mingzi,riqi,zname); printf("\n%-8d%-23s%-18s%-10s\n", zhenghao,mingzi,riqi,zname); } fclose(fp); printf("\n按任意键返回\n"); getch();//返回 jmain();//调用借阅系统 } void cxjs()//查询借书 { FILE *fp; int jsnum=0,k=0,many=0,m=0,n=0; char jsnam[20]={'\0'},jstime[20]={'\0'},tsnam[20]={'\0'}; char i; char chazhao[20]={'\0'}; if ((fp=fopen("reader.txt","r"))==NULL)//打开文件 { system ("cls"); printf("\n记录文件不存在!按任意键返回"); getch(); jmain(); } system("cls"); printf("请输入证号或姓名查询:\n"); scanf("%s",chazhao); system ("cls"); m=tjzs(); for (n=0;n 
           
             next=p1; p2=p1; p1=(struct land*)malloc(LEN2);//新建链表 } p1->zhanghao=zhanghao1; strcpy(p1->password,mima1);//复制账号密码 } } if (n==0) { head=NULL; } else//建立链表的最后剩余一个储存空间,所以封底 { p2->next=p1; p1->next=NULL; fclose(fp); } fp=fopen("land.txt","w");//清空文件,只写打开,然后关闭 fclose(fp); fp=fopen("land.txt","a");//追加文件 p=head; for (;p!=NULL;)//把链表内容覆盖到文件 { fprintf(fp,"%d %s%\n",p->zhanghao,p->password); p=p->next; } fprintf(fp,"%d %s\n",z,m); fclose(fp); system ("cls"); } void xgmm()//修改密码 { FILE *fp; int zh=0,k=0,many=0,m=0,n=0; int chazhao,hit; char mima[20]={'\0'},password1[20]={'\0'}; char mm[20]={'\0'}; char i; if ((fp=fopen("land.txt","r"))==NULL)//打开文件 { system ("cls"); printf("\n记录文件不存在!按任意键返回"); getch(); system("cls"); lmain(); } system("cls"); printf("请输入你的帐号和旧密码:\n"); scanf("%d %s",&chazhao,mima); m =tjzs3(); for (n=0;n<=m;n++) { fscanf(fp,"%d %s",&zh,mm); if(zh==chazhao) { if(!strcmp(mm,mima)) { printf("请输入新的密码"); scanf("%s",mima); printf("再次输入密码:\n"); scanf("%s",password1); if(strcmp(mima,password1)==0) { xg(chazhao,mima); getch(); lmain(); system("cls"); } else { printf("两次输入密码不一致,按任意键退出"); hit=getch(); system("cls"); lmain(); } } else { printf("旧密码错误,按任意键返回!"); getch(); system("cls"); lmain(); } } } printf("不存在此账号,按任意键返回"); fclose(fp);//修改结束 getch(); system("cls"); lmain(); } int main() { system("color 1F"); lmain(); return 0; } 
            
           
          
         
        
       
      
     
    
  

5.遇到的难点及解决办法

(1)不知道如何停止程序,以及只让程序在ESC和回车按下后才继续工作。
解:查阅资料getch()
所在头文件:conio.h
函数用途:从控制台读取一个字符,但不显示在屏幕上
函数原型:int getch(void)
返回值:读取的字符
代码: for(;i!=13&&i!=27;)
i=getch();














(2)不知道C语言未初始化的变量的值,导致无限循环。
解:全局变量 、静态变量初始值为0
局部变量,自动变量初始值随机分配




(3)不知道如何快速清理文件和新建文件
解:查阅览书本后知道,先只写文件,如果文件名和已存在的相同,那么就会先删除原有文件,而且如果不存在文件将会之间新建文件。
fp=fopen(“library.txt”,“w”); \清空
fclose(fp);
if ((fp=fopen(“library.txt”,“r”))==NULL)//快速新建
{

fp=fopen(“library.txt”,“w”);
fclose(fp);
}
















(4)对a!=2和a=!2弄混淆
解:a!=2:表示a不等于“2”;
a=!2:表示a等于“!2”(0);




(5)编译正确,但是有的时候scanf语句好像没有执行,输入数据回车,程序没反应
解:查阅得知:
这种情况通常发生在前面已经有了输入语句,而当前的scanf是在接收字符(即用%c控制输入)时。由于前面的输入语句(不一定是scanf)把最后输入的’\n’遗留在了输入缓冲区,而当前的scanf(“%c”,…);又会把’\n’当一个字符接收,又由于scanf在%c控制下只接收一个字符,所以就不能接收正式输入的字符了。解决这一问题的最简单办法是在接收字符的scanf的控制符”%c”中的%前加一个空格写成” %c”,把前一次输入遗留在输入缓冲区里的所有广义空格(’ ‘、’\t’、’\n’等)都吸收掉。在接收字符的scanf前加getchar()等的办法其实是有漏洞的——当缓冲区里只遗留了一个广义字符时可正常工作,若多于一个则同样出错。 按回车没反应




(6),关于“feof”的误区
For(;!feof(fp)?;
n++;
n–;来判断文件里面字符的个数为什么错误,
查阅得知:
1.EOF
EOF是一个计算机术语,为End Of File的缩写,在操作系统中表示资料源无更多的资料可读取。资料源通常称为档案或串流。通常在文本的最后存在此字符表示资料结束。这个定义的意思是,文档的结尾都有一个隐藏字符”EOF”,当程序读取它的时候,就会知道文件已经到达结尾。通常使用while循环加EOF判断作为读取结束的标志。
EOF 的值通常为 -1,但它依系统有所不同。
2.feof()
feof()的原理:
feof()函数,并不是通过读取到文件的EOF来评判,这个文件是否为空。
对feof()来说,它的工作原理是,站在光标所在位置,向后看看还有没有字符。如果有,返回0;如果没有,返回非0。它并不会读取相关信息,只是查看光标后是否还有内容。
直接使用时的错误分析:
对于一个空文件来说,当程序打开它的时候,它的光标会停在文件的开头,但是由于文件里什么内容都没有存(但是EOF是存在的),即整个文件就存贮了一个EOF。当程序打开文件,并直接调用feof()时,这个函数就会站在光标的位置向后张望,结果就看见了EOF,然后就当然返回0了。所以使用feof()函数时,必须要读取文件,让光标移动。


























(7)错因:用正确的格式写入文件,结果却没有数据
解:没有及时fclose(fp),不弥补数据储存的原理。
打开文件fopen函数把返回值赋给fp,用fclose关闭文件,如果不关闭文件就结束程序将会丢失数据,因为,在向文件里面写入数据时,是先将数据输入到缓冲区,待缓冲区从满后才正式输出给文件。因此用fclose函数关闭文件时,先把缓冲区中的数据输出到磁盘文件,然后才撤销文件信息区。




下载链接
链接:https://pan.baidu.com/s/13fFq7OwTb9ulWMRYHym-ZA 密码:4wbd
亲,点个赞
 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225913.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午8:15
下一篇 2026年3月17日 上午8:16


相关推荐

  • 门面模式详解

    门面模式详解门面模式门面模式 FacadePatter 又叫外观模式 提供了一个统一的接口 提供了一个统一的接口 用来访问子系统中的一群接口 其主要特征是定义了一个高层接口 让子系统更容易使用 属于结构性模式 其实 在我们日常的编码过程中 我们都在有意无意地大量使用门面模式 但凡只要高层模块需要调度多个子系统 2 个以上类对象 我们都会自觉地创建一个新类封装这些子系统 提供精密接口 让高层模块可以更加容易简介调用这些子系统的功能 尤其是现阶段各种第三方 SDK 各种块原类库 很大概率都会使用门面模式 尤其是你觉得

    2026年3月17日
    2
  • javascript中数据类型有哪些_四种基本数据类型

    javascript中数据类型有哪些_四种基本数据类型JavaScript里有几种数据类型

    2025年9月21日
    11
  • Redis客户端中文乱码[通俗易懂]

    Redis客户端中文乱码[通俗易懂]Redis客户端中文乱码$redis-cliredis127.0.0.1:6379&gt;set’name”中文’OKredis127.0.0.1:6379&gt;get’name’"\xd6\xd0\xce\xc4"redis127.0.0.1:6379&gt;客户端查看乱码,这个情况我们只要将修改客户端命令行就可以。redis-cli –raw$r…

    2022年5月7日
    233
  • 从零使用qemu模拟器搭建arm运行环境

    从零使用qemu模拟器搭建arm运行环境本文从零开始介绍如何搭建qemu+arm的运行环境

    2022年6月10日
    35
  • 即梦图片4.0模型案例-一图生多图

    即梦图片4.0模型案例-一图生多图

    2026年3月13日
    1
  • hive 数据类型_sv数据类型

    hive 数据类型_sv数据类型本篇来学习一下Hive中的数据类型,以及如何在HiveSQL中去处理这些数据类型。Hive的数据类型可以分为基本类型、字符串类型、日期与时间戳类型、集合类型,我们分别进行介绍:1、基…

    2026年2月6日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号