关于gets在循环中的使用
约 255 字小于 1 分钟
2024-11-03
问题
for (int i = 0; i < 3; i++) {
printf("Enter name\n");
gets(stu[i].name);
printf("Enter math\n");
scanf("%d", &stu[i].math);
printf("Enter english\n");
scanf("%d", &stu[i].eng);
stu[i].aver = (float) (stu[i].math + stu[i].eng) / 2;
}
这是一个接受学生名字、科目分数的循环
但结果
Enter name
li
Enter math
78
Enter english
89
Enter name
Enter math
......
在第八行应该接收name的输入,但却被跳过了
for (int i = 0; i < 3; i++) {
printf("Enter name\n");
scanf("%s", stu[i].name);
printf("Enter math\n");
scanf("%d", &stu[i].math);
printf("Enter english\n");
scanf("%d", &stu[i].eng);
stu[i].aver = (float) (stu[i].math + stu[i].eng) / 2;
}
当换成scanf()接收后
Enter name
li
Enter math
78
Enter english
89
Enter name
wang
Enter math
......
此时接收正常
原因
在gtes()前的scanf()执行后会遗留一个'/n'在缓冲区里,而在执行gets()时会将那个回车读取,因而跳过。
解决方法
使用 fflush(stdin) 函数清理默认缓冲区
或使用scanf()