scanf_s二次调用失效致无限循环?如何实现输入合法性校验
解决scanf_s非法输入导致无限循环的问题
问题根源
当输入非整数内容(比如12a、abc)时,scanf_s("%d", &option)会读取失败并返回0,且这些非法字符会残留于输入缓冲区中。后续再次调用scanf_s时,会直接读取缓冲区里的无效内容,不会等待用户输入新值,导致ret始终为0,陷入无限循环。
修复方案
每次scanf_s读取失败后,必须清空输入缓冲区的残留字符,才能让下一次输入正常接收用户的新内容。可以通过getchar()循环读取缓冲区字符,直到读到换行符或文件结束符。
完整代码示例
#include <cstdio> #include <iostream> using namespace std; int main() { int option; int ret = scanf_s("%d", &option); while (!ret) { cout << "Provide an integer, not a string! :)\n"; // 清空输入缓冲区的残留字符 int c; while ((c = getchar()) != '\n' && c != EOF) { // 循环读取并丢弃缓冲区字符,直到换行或输入结束 } ret = scanf_s("%d", &option); } cout << "You entered: " << option << endl; return 0; }
补充说明
getchar()逐字符读取缓冲区内容,循环到'\n'停止,确保缓冲区被彻底清空,不会影响下一次输入。- 部分Windows编译器(如MSVC)支持用
fflush(stdin)清空输入缓冲区,但该操作不符合C++标准,跨平台兼容性差,更推荐使用getchar()循环的方式。
内容的提问来源于stack exchange,提问作者Zeek Liviu
相关产品推荐
相关产品推荐

