在写程序设计进阶课的结课项目时,遇到这样一个bug:
在使用scanf函数读取用户输入时,发现scanf函数被跳过了,无法从键盘输入数据,源代码如下:
//学生信息添加模块
int information_adding_module()
{
//函数声明
int file_check();
int file_create();
//变量声明
char whether_exsit;
char whether_create;
//添加学生信息菜单
system("cls");
printf("******************************************************************\n");
printf("* 学生信息维护系统 *\n");
printf("******************************************************************\n");
printf("当前位置:添加学生信息\n");
whether_exsit=file_check();
if(whether_exsit==-1)
{
printf("信息文件不存在,是否新建信息文件?(y/n)");
scanf("%c",&whether_create);
if(whether_create=='y')
{
if(file_create()==1)
printf("文件创建成功!");
else
printf("文件创建失败,请重试!");
}
}
程序执行到 printf("信息文件不存在,是否新建信息文件?(y/n)"); 处时,跳过了下一行的 scanf 函数。
查找bug原因,发现与scanf函数的读取方式有关。
用户从键盘输入数据时,数据被保存在缓冲区,包括空格、回车、tab等,输入结束按下回车后,程序再从缓冲区读取数据输入程序执行。在这段程序中,调用scanf函数之前缓冲区已经有数据存在(可能是之前输入的回车符之类的,来源不明)导致了程序直接读取了缓冲区内的数据,而不是等待用户输入。
解决方法:使用 fflush() 函数清空缓存区。
fflush(stdin);
成功解决一个bug ( •̀ ω •́ )y!