c语言关于清除缓存区回车的问题
结构体stud就是学生信息,信息通过函数手动填入,可以不必深究。我的关键问题就在函数这个地方的两个flag,其实函数的其他部分也不必深究。
struct stud
{
char num[5],name[10];
int s[4]; /*s存放4个科目的成绩*/
double ave; /*存放平均成绩*/
};
void readrec()
{
int i,j;
struct stud st[3];
for(i=0;i<3;i++) /*外循环,读入3个学生的信息*/
{
gets(st[i].num); /*立个 flag1 */
gets(st[i].name);
for(j=0;j<4;j++) /*内循环,读入一个学生的4个成绩*/
{
scanf("%d",&st[i].s[j]);
st[i].ave+=st[i].s[j]/4.0;
}
getchar(); /*立个 flag2 */
}
}
main() /*main函数也没啥东西,不用看*/
{
readrec();
system("pause");
return(0);
}
flag2这里的解释是“读走留在缓存区内的回车符”,这个我懂,就是在激活scanf函数运行时留下的回车,会被flag1的gets读入(大概是这样吧?)。
那么问题来了,既然某一轮循环中的scanf留下的回车会在下一个新循环中被flag1处gets函数读走,为什么flag1的gets函数没有留下回车?又或者是,为什么flag1留下的回车并没有被紧接着flag1的gets函数读入?
在c语言的标准输入函数中
gets/getchar会读取回车的
只有 scanf会把回车留在输入缓冲中
所以你的 flag1 缓冲中中没有回车的
即使有,scanf会跳过它
所以只有当gets/getchar/scanf混用时,才需要读走留在缓存区内的回车符
其实,更好的处理输入缓存区内的回车符的方法不是用
getchar()
而是用
fflush(stdin); //这个才是标准的用法,在 flag2 处
语言编程错误
这个可以认为是下一行吗 是2问题连续读 循环之间需要排序吗?就是休息号