69,377
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
struct Book
{
int num; //图书编号
char aut[50]; //作者
float price; //图书价格
char pub[50]; //出版商
char name[50]; //书名
int kc; //库存
};
void jieshu(); //借阅
void jskc(Book b);
void jieshu()
{
struct Book b;
int s;
int w;
char sr[50];
printf("请输入要借阅的书籍(格式:《-书名-》):\n");
scanf("%s", sr); /* remove '&' */
FILE*fp;
fp=fopen("allbook.txt","r");
fscanf(fp,"%d%s%s%s%f%d",&b.num, b.name, b.aut, b.pub, &b.price,&b.kc);
if(strcmp(sr,b.name)==0&&b.kc!=0)
{
printf("是否借阅(1.YES \ 2.NO)");
scanf("%d", &s);
switch(s)
{
case 1:
jskc(b);
printf("借阅成功!\n");
break;
case 2:
ex();
}
}
else
{
printf("无法借阅!该图书可能不存在或库存不足!\n");
printf("是否需要查询?(1.yes \ 2.no)\n");
scanf("%d",&w);
switch(w)
{
case 1:
findbook();
case 2:
ex();
}
}
fclose(fp);
}
void jskc(Book b)
{
FILE*fp;
Book c[1010];
int i,j;
i = 0;
fp=fopen("allbook.txt","r");
while(fscanf(fp,"%d%s%s%s%f%d", &c[i].num, c[i].name, c[i].aut, c[i].pub,&c[i].price,&c[i].kc)!=EOF) /* remove '&' */
i++;
fclose(fp);
fp = fopen("allbook.txt","w");
for(j = 0;j<i;j++)
{
if(b.num ==c[i].num&&b.name == c[i].name&&b.aut == c[i].aut&&b.pub == c[i].pub&&b.price == c[i].price&&b.kc == c[i].kc)
{
fprintf(fp,"%d %s %s %s %f %d\n",b.num,b.name,b.aut,b.pub,b.price,b.kc-1);
}
else
fprintf(fp,"%d %s %s %s %f %d\n",c[i].num,c[i].name,c[i].aut,c[i].pub,c[i].price,c[i].kc);
}
fclose(fp);
}
出现特殊字符,主要是字符串没有找到结束标记,注意你的输入是否导致了字符串越界。
scanf和fscanf有写输入不需要加&的,因为数组名本身就是地址。建议对比一下,那些是不需要&的。
最后,建议注意下代码风格:比如
fprintf(fp, "%d %s %s %s %f %d\n", c[i].num, c[i].name, c[i].aut, c[i].pub, c[i].price, c[i].kc);
加空格,让代码读起来更方便。