发现问题:
在写运动会成绩管理系统(结构体)时,菜单输入时,进行合法性验证,若输入的不是菜单中所选择的内容,则需要用户重新输入。使用的是while循环对用户输入进行验证,代码如下:
scanf("%d", &key);
while (key != 1 && key != 2 && key != 3 && key != 4 && key != 5 && key != 6 && key != 0)
{
printf("\n输入有误,请重新输入完成对应操作\n请输入:");
fflush(stdin);
scanf("%d", &key);
}
return key;
出现的运行结果如下:
在查询原因后,发现是scanf与缓冲区的问题,由于第一次输入时会有回车,所以scanf会读取缓冲区的回车符,导致循环条件一直为true,一直循环。
解决方法:
1.使用getchar();或者gets_s();接收回车符
2.使用fflush(stdin);清除I/O流级别的缓冲区
3.使用rewind(stdin); rewind()函数的作用是把文件的当前位置指针指向文件头 清除标准输入的按键缓冲区
解决后代码如下:
scanf_s("%d", &key);
while (key != 1 && key != 2 && key != 3 && key != 4 && key != 5 && key != 6 && key != 0)
{
rewind(stdin);
printf("\n输入有误,请重新输入完成对应操作\n请输入:");
scanf("%d", &key);
}
运行结果如下: