#include <stdio.h>
#include <stdlib.h>
#define len sizeof(struct fanka)
struct fanka
{
int kahao;
char name[100];
int money;
struct fanka *next;
};
struct fanka *create()
{
struct fanka *head=NULL;
struct fanka *tail;
struct fanka *n;
int count=0;
while(1)
{
n=(struct fanka *)malloc(len);
printf("请输入学生的卡号、姓名、金额:\n");
scanf("%d,%s,%d",&n->kahao,n->name,&n->money);
if(n->kahao==0)
{
free(n);
break;
}
else
{
if(count==0)
{
head=n;
tail=n;
}
else
{
tail->next=n;
tail=n;
}
count++;
}
}
tail->next=NULL;
return head;
}
void prin(struct fanka *head)
{
struct fanka *s;
s=head;
if(s==NULL)
printf("这是一个空表。");
else
{
while(s!=NULL)
{
printf("\n%d %s %d",s->kahao,s->name,s->money);
s=s->next;
}
}
}
void chongzhi(struct fanka *head)
{
struct fanka *s;
s=head;
int n,yuan,z;
printf("请输入学生的卡号:");
scanf("%d",&n);
printf("请输入要充值的金额:");
scanf("%d",&yuan);
for( ;s!=NULL && s->kahao!=n;s=s->next)
;
if(s==NULL)
printf("卡号输入错误,请重新输入。");
else
z=s->money+yuan;
printf("充值前卡内金额为%d,充值后卡内金额为%d。",s->money,z);
}
void maifan(struct fanka *head)
{
int n,m,z;
printf("请输入学生的卡号:");
scanf("%d",&n);
printf("请输入饭费:");
scanf("%d",&m);
struct fanka *s;
s=head;
if(m<0)
printf("饭费不可为负。");
else
{
for( ;s!=NULL && s->kahao!=n;s=s->next)
;
if(s==NULL)
printf("卡号输入错误。");
else if(s->money<5)
printf("余额不足,请充值。");
else
{
z=s->money-m;
printf("买饭成功。买饭前余额为%d,买饭后余额为%d",s->money,z);
}
}
}
int main()
{
int a;
struct fanka *head=NULL;
head=create();
prin(head);
while(a!=3)
{
printf("\n请选择您想要进行的服务:\n");
printf("1.买饭 2.充值 3.退出系统\n");
scanf("%d",&a);
switch(a)
{
case 1: maifan(head);break;
case 2: chongzhi(head);break;
case 3: break;
defaulf :printf("请选择正确的序号\n");
}
}
return 0;
}
问题其实是scanf中%s会一直读取字符串,所以程序会把name设置为“zhangsan,100”,而money则会因为是空值而变成其他奇怪的数字。
要解决这个问题,只能一行一行的输入:
struct fanka *create()
{
struct fanka *head=NULL;
struct fanka *tail;
struct fanka *n;
int count=0;
while(1)
{
n=(struct fanka *)malloc(len);
printf("请输入学生的卡号、姓名、金额:\n");
// 一行一行输入
scanf("%d", &n->kahao);
scanf("%s", n->name);
scanf("%d", &n->money);
// scanf("%d,%s,%d",&n->kahao,n->name,&n->money);
if(n->kahao==0)
{
free(n);
break;
}
else
{
if(count==0)
{
head=n;
tail=n;
}
else
{
tail->next=n;
tail=n;
}
count++;
}
}
tail->next=NULL;
return head;
}