
#include
#define N 3
union sel
{ int body;
float jump;
};
struct student
{ char num[10];
char sex;
float run;
union sel pick;
};
void myinput(struct student *p)
{ int i=0;
float x=0,y=0;
for(i=0;i
scanf("%s,%c,%f",p[i],&p[i].sex,&x);/***1***/
p[i].run=x;/***2***/
//scanf("%s,%c,%f",p[i],&p[i].sex,&p[i].run);/***3***/
if(p[i].sex=='M')
{ printf("Input pull_up score:");
scanf("%d",&p[i].pick.body);
}
else if(p[i].sex=='F')
{ printf("Input long jump score:");
scanf("%f",&y);/***4***/
p[i].pick.jump=y;/***5***/
//scanf("%f",&p[i].pick.jump);/***6***/
}
else
{ printf("Invalid sex,input again:\n");
i--;
}
}
}
void myoutput(struct student *p)
{ int i=0;
printf("Sport record:\n");
printf("number sex 100_metre pull_up jump\n");
for(i=0;i
if(p[i].sex=='M')
printf("%d\n",p[i].pick.body);
else if(p[i].sex=='F')
printf("%10.2f\n",p[i].pick.body);
}
}
main()
{ struct student a[N];
myinput(a);
myoutpu他(a);
}
一、请问可以把1、2改为3,4、5改为6吗?为什么?
二、在1中,从键盘输入number时直接存到p[i]中,为什么不是&p[i]?
三、在1、2中,为什么sex可以直接存到&p[i].sex中,而100_metre dash score不能直接写&p[i].run,却要存到变量x中,再传给p[i].run?
谢谢,请大侠指点!我不是很明白...
一个一个来回答:
一 可以改成这样子,因为给结构体的子项赋值就是这么做的啊--取子项的起始地址然后输入数据,但是"%s,%c,%f"这样的输入格式是有问题的,如果我输入的是001,F,13.7,那么p[i].num里存的是"001,F,13.7",而sex,run中的内容就不确定了,因为scanf接受字符串时以空格或回车为结束标志,所以这一整串都存到num里去了,如果输入的是"001 ,F,13.7"这样num里的数据没问题,但是sex和run中的内容是错误的,我建议你把输入格式改为"%s %c %f"数据之间以空格间隔,这样输入的时候就不会出问题了;还有很重要的一点是scanf的第一个变量,p[i]有问题,p是一个结构体数组的起始地址,p[i]表示的是结构体,而我们需要的是p[i]的地址而非p[i]这个结构体,所以这里在运行的时候会出现悔渗内存错误,这里可以改为&p[i](可以这样用是因为num是p[i]的第一个子项,它们的起始地址相同),或者p[i].num(num是字符数组的起始地址所以不必要加&)
二 显然一中已经指出p[i]是错误的,而&p[i]是正确的(通过VC++ 6.0以及DEV C++验证)
三 一中已经指出,这样做是可以的(也验证通过)
myoutput里面当sex==F时
应该printf("%10.2f\n",p[i].pick.jump);吧
我把我改后的源代码贴上,你可以运行试试,这些问题都明朗了
#include
#include
#define N 3
union sel
{ int body;
float jump;
};
struct student
{ char num[10];
char sex;
float run;
union sel pick;
};
void myinput(struct student *p)
{ int i=0;
float x=0,y=0;
for(i=0;i
//scanf("%s,%c,%f",p[i],&p[i].sex,&x);/***1***/
//p[i].run=x;/***2***/
scanf("%s %c %f",&p[i],&p[i].sex,&p[i].run);/***3***/
if(p[i].sex=='M')
{ printf("Input pull_up score:");
scanf("%d",&p[i].pick.body);
}
else if(p[i].sex=='F')
{ printf("Input long jump score:");
//scanf("%f",&y);/***4***/
//p[i].pick.jump=y;/***5***/
scanf("%f",&p[i].pick.jump);/***6***/
}
else
{ printf("Invalid sex,input again:\n");
i--;
}
}
}
void myoutput(struct student *p)
{ int i=0;
printf("Sport record:\n");
printf("number sex 100_metre pull_up jump\n"卖前罩);
for(i=0;i
if(p[i].sex=='M')
printf("%d\n",p[i].pick.body);
else if(p[i].sex=='F')
printf("%10.2f\n",p[i].pick.jump);
}
}
main()
{ struct student a[N];
myinput(a);
myoutput(a);
}
结构体要写 typedef struct
{
成员名;
}
解决二:
因为你定义了一个结构体指针P,p已经是一个地址了,当或戚镇仔磨你取址存值时,只要拿地址就行,衫粗不用加&了。