回车被scanf吸收问题——getchar()来解决
1.问题描述:
如上图的程序进行了两次for循环,同时会执行两次scanf输入。
在or循环第一次时,需要进行第一次scanf输入,每次scanf输入一次数据需要按一次回车,程序才会继续往后走,而后才会进入接下来的if和else的判断语句。
在for第二次循环时,由于第一次for循环进行的第一次scanf输入,我们输入了一次数据,并按了一次回车。这个回车,它导致我们第二次for循环中的第二次scanf输入功能失效。通俗讲就是第二次循环的scanf它以为我们第一次的回车是我们输入的数据,第二次循环中的scanf它吸收了我们第一次按的回车按键然后结束了,导致直接跳过了我们的第二次scanf,我们称它为回车被scanf吸收问题。
2.解决方案:
用getchar()先把回车给吸收掉,再进入下一次循环的scanf。
(下面是例程代码,直接复制就可以执行,我们可以尝试把getchar()删掉看看有和没有的区别)
详细解释:
针对这个问题,我们要在进行第一次scanf输入完数据后按了回车后,我们要把这个回车先吸收掉,再进入下一次循环中的scanf输入。所以在每次for循环后面用getchar假装获取个输入,把这个回车当作输入吸收掉,然后再进入下一次循环scanf。
3.例程代码:
#include <stdio.h>
struct Person
{
char name[32];
int age;
char zhiYe;
char addr[32];
union {
int class;
char keMu[12];
}mes;
};
int main()
{
struct Person p[2];
int i;
for(i=0;i<2;i++){
printf("请输入职业:t代表老师,s代表学生\n");
scanf("%c",&(p[i].zhiYe));
if(p[i].zhiYe == 's'){
printf("请输入学生班级:\n");
scanf("%d",&(p[i].mes.class));
printf("请输入学生名字:\n");
scanf("%s",p[i].name);
}
else{
printf("请输入老师的科目:\n");
scanf("%s",p[i].mes.keMu);
printf("请输入老师名字:\n");
scanf("%s",p[i].name);
}
getchar();
}
for(i=0;i<2;i++){
if(p[i].zhiYe == 's'){
printf("学生的名字是:%s,班级是%d\n",p[i].name,p[i].mes.class);
}
else{
printf("老师的名字是:%s,职业是%s\n",p[i].name,p[i].mes.keMu);
}
}
return 0;
}