(c语言)为什么运行时后面出现一长串数字?

img


#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;
}