问题遇到的现象和发生背景
我使用下面的还书函数进行还书,如果同一个人借阅了两本书,例如张三,借阅了物理和数学;我先归还物理,然后结束程序再按学号查询张三所借阅的书时,会显示张三借阅了数学和数学。问题就是在这个时候数据重复写了一次,我不知道问题出在哪里?
问题相关代码,请勿粘贴截图
void retunr()
{
int ii=0,jj=0;
char *dstxuehao=malloc(50);
char *dbookname=malloc(50);
if((fpr=(fopen("student.txt","r")))==0)
{
printf("文件打开失败!\n");
return;
}
for(ii=0;ii<STN;ii++) //读取文件中数据并存入结构体数组中
{
fscanf(fpr,"姓名:%8s 班级:%8s 学号:%15s 借阅图书名:%8s\n",&std[ii].stname\
,&std[ii].mjdcls,&std[ii].xuehao,&std[ii].sbookname);
}
printf("请输入借阅人学号:\n");
scanf("%s",dstxuehao);
for(ii=0;ii<STN;ii++)
{
if((strcmp(std[ii].xuehao,dstxuehao))==0)
{
jj=jj+1;
}
}
if(jj==0)
{
printf("未检索到学生借阅信息------\n");
printf("3s后返回主菜单------------\n");
sleep(3);
return;
}
for(ii=0;ii<STN;ii++)
{
if((strcmp(std[ii].xuehao,dstxuehao))==0)
{
printf("姓名:%8s 班级:%8s 学号:%15s 借阅图书名:%8s\n",std[ii].stname\
,std[ii].mjdcls,std[ii].xuehao,std[ii].sbookname);
}
}
printf("请输入需要归还的图书名:\n");
scanf("%s",dbookname);
printf("开始检索中(未找到目标文件自动结束)-------\n");
for(ii=0;ii<STN;ii++)
{
if((strcmp(std[ii].sbookname,dbookname))==0) //将输入的书名与已入库的书名进行对比
{
printf("删除中----------\n");
strcpy(std[ii].sbookname,""),strcpy(std[ii].mjdcls,""),strcpy(std[ii].stname,""),strcpy(std[ii].xuehao,"");
printf("删除成功^_^!------\n");
}
}
fpr=fopen("student.txt","w");
for(ii=0;ii<STN;ii++) //将数据重新写入txt文本
{
if((strcmp(std[ii].stname,""))!=0)
fprintf(fpr,"姓名:%8s 班级:%8s 学号:%15s 借阅图书名:%8s\n",std[ii].stname\
,std[ii].mjdcls,std[ii].xuehao,std[ii].sbookname);
}
fflush(fpr);
printf("3s后返回主菜单-----\n");
free(dstxuehao),free(dbookname);
sleep(3);
return;
}
运行结果及报错内容
我的解答思路和尝试过的方法
我感觉是文件写入有问题,使用文件操作的一些函数没注意到一些点,望帮助解决
我想要达到的结果
归还完第一本书后,不会重复显示张三剩余的那本书
感谢