大型 视频网站开发,微网页制作模板,企业品牌推广网站,鞍山制作网站的公司现象描述
题目要求输入一个整数n(0n20)#xff0c;需要考虑非法字符输入的情况。若输入非法字符或者不在合法区间#xff0c;则重新输入。于是我们很自然的打出了如下代码#xff1a;
int a;
while(1){scanf(%d,a);if(a0a20) …现象描述
题目要求输入一个整数n(0n20)需要考虑非法字符输入的情况。若输入非法字符或者不在合法区间则重新输入。于是我们很自然的打出了如下代码
int a;
while(1){scanf(%d,a);if(a0a20) break;
}我们运行一下后就会发现一旦我们输入了一个非法字符如aaaaasdas那么我们接下来输什么都没有用程序陷入了死循环。
原理分析
经多方查找资料得知scanf有缓存区当输入非法字符要求的类型与输入的类型不符合scanf会直接跳过即该输入不会被接收也不会被清除而会被存放在scanf的缓存区当下次调用scanf函数时会直接从缓存区读取非法字符造成死循环。
解决思路
清除滞留在scanf缓存区的数据使下一次循环时scanf可以正常的读取用户输入。
解决方法
用getchar把缓冲区清空。
//法一
int a;
while(1){scanf(%d,a);if(a0a20) break;while(getchar()!\n); //清空缓存区直到换行输入
} //法二
int a,m0;
do{mscanf(%d,a);//m是scanf读入的数的个数 if(m!1)//如果读入了一个数 即 输入了一个s整数 while(getchar()!\n); //清空缓存区直到换行输入
}while(m!1||a0||a20);直接使用缓冲区清除函数fflush(stdin); //stdin代表标准输入。
int a;
while(1){fflush(stdin);//在每次输入前清空缓冲区scanf(%d,a);if(a0a20) break;
}