参考自:http://blog.sina.com.cn/s/blog_5e8facd20100lqqg.html
scanf只能将缓冲区中的数字(使用了%d)读入iCmdNum,并清空缓冲区,而我们输入的是非数字,那么scanf读入失败,失败了它也就不会去清空缓冲区,这样造成的结果就是,我们不需要再输入其它字符,scanf每次都会去读缓冲区,每次都失败,每次都不会清空缓冲区,当下次再来读时发现缓冲区中有数据就不会停止等用户输入,接着又进入下一次的循环,死循环就形成了。
void CmdRunning()
{
int iCmdNum;
do {
printf("请选择:0. 退出;1. 新建文件;2. 打开文件;3.保存文件\n");
scanf("%d",& iCmdNum);
if (0 == iCmdNum) {
printf("谢谢使用,再见!\n");
}
else if (1 == iCmdNum) {
CreateFile();
}
else if (2 == iCmdNum) {
OpenFile();
}
else if (3 == iCmdNum) {
SaveFile();
}
else {
printf("对不起,你选择的数字不存在,请重新选择!\n");
}
}while(iCmdNum!=0);
}
这段程序存在一个很严重的Bug,比如,运行程序后输入字符’a’(非数字),回车,死循环出现了。
解决方法:
“scanf("%d",&iCmdNum);”语句是V0.1版本出现死循环的关键,那么我们不妨先从这里入手。
其实只要将“%d“改为“%c”,即可解决死循环问题。比如:
如果出现问题,将如何解释?
l
l
l
所引起的。因为在输入输出流中所有的类型都会被当作字符来看待,那么当使用%c来读入chCmd时,不管输入什么样的
值都会成功。当scanf成功之后,则会将缓冲区中的字符清空 (实际上是将“流指针”后移),等待下一次用户的输入,所
以它不会出现死循环。