关于结构体和共用体,求救啊~~~~~

struct person
{
char name[20];
char flag;
union
{

int clas;
char office[20];
}x;
char address[20];
union
{
char zhic[20];
int score;
}y;
};

void main()
{ struct person p[50];
int i=0,n;
while(i<=50)
{
printf("please input the job and information.(student--s teacher--t)\n");
scanf("%c",&p[i].flag);
printf("%c weishao\n",p[i].flag);
if(p[i].flag=='#') break;
if(p[i].flag=='s')
scanf("%s%d%s%d",p[i].name,&p[i].x.clas,p[i].address,&p[i].y.score);
if(p[i].flag=='t')
scanf("%s%s%s%s",p[i].name,p[i].x.office,p[i].address,p[i].y.zhic);
i++;
}
。。。。。
编译后输入第一个数据后,程序自动跳过第二个进入第三个,这是为啥a???

第1个回答  2011-12-13
void main()
{ struct person p[50];
int i=0,n;
while(i<=50)
{
printf("please input the job and information.(student--s teacher--t)\n");
scanf("%c",&p[i].flag);
while(getchar()!'\n'); //加上这句,清空一下每次输入数据后的剩余字符
printf("%c weishao\n",p[i].flag);
if(p[i].flag=='#') break;
if(p[i].flag=='s')
scanf("%s%d%s%d",p[i].name,&p[i].x.clas,p[i].address,&p[i].y.score);
if(p[i].flag=='t')
scanf("%s%s%s%s",p[i].name,p[i].x.office,p[i].address,p[i].y.zhic);
i++;
}
第2个回答  2011-12-13
原因就是,输入结束符——换行符也是一个字符,一直留在输入缓冲区中,下次scanf("%c",...)的时候,会直接从缓冲区中去取,所以感觉就是跳过了第二个
对于纯C语言的话,可以在i++后加getchar()函数来读取换行符
对于C++的话,可以在i++后加fflush(stdin)函数就好了
第3个回答  2011-12-13
if(p[i].flag=='s')
scanf("%s%d%s%d",p[i].name,&p[i].x.clas,p[i].address,&p[i].y.score);
if(p[i].flag=='t')
scanf("%s%s%s%s",p[i].name,p[i].x.office,p[i].address,p[i].y.zhic);
getchar(); //加上这个,防止回车符产生的影响,或用其他方法清空输入缓冲区。

//这是因为,你输入上面的数据后,最后一个回车,表示输入完毕,回车也是字符啊 '\n',所以当输入flag的时候,它把这个作为你输入的,赋值给flag了。本回答被提问者采纳
第4个回答  2011-12-13
好像和scanf去结果后不清空缓冲区里的回车换行符有关,在第二次输入字符的地方实际上缓冲区里还有回车符存在,scanf直接取了0xa。
解决:
在输入字符前清一下缓冲,
fflush(stdin);
scanf("%c",&p[i].flag);

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网