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++;
}
{ 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)函数就好了
对于纯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了。本回答被提问者采纳
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);
解决:
在输入字符前清一下缓冲,
fflush(stdin);
scanf("%c",&p[i].flag);