使用scanf返回值验证输入失效,陷入死循环求助
解决scanf读取非整数时的无限循环问题
我来帮你搞定这个问题!你遇到的无限循环是因为scanf读取失败后,无效输入还留在输入缓冲区里,导致后续的scanf一直读不到有效整数,永远返回0。
问题根源
当你输入非整数(比如abc或者!@#)时,scanf("%d", &boxNumber)无法把这些字符解析成整数,所以返回0,而且这些无效字符会卡在输入缓冲区里,不会被自动清除。下一次循环调用scanf时,它会直接读取缓冲区里的这些无效字符,再次解析失败返回0,就这样无限循环下去。
解决方案
解决的核心是在scanf失败后清空输入缓冲区,把那些无效字符全部扔掉,直到遇到换行符(也就是用户输入时按下的回车)。同时要注意处理EOF(比如用户按Ctrl+D终止输入)的情况,避免内层循环无限运行。
修改后的代码如下:
printf("\nBox number: "); int boxNumber, err; err = scanf("%d", &boxNumber); while (err != 1) { printf("\nWrong input."); // 清空输入缓冲区里的无效字符 int c; while ((c = getchar()) != '\n' && c != EOF) { // 仅读取字符,不做额外操作 } // 处理用户终止输入的情况 if (c == EOF) { printf("\nInput terminated."); break; } printf("\nBox number: "); err = scanf("%d", &boxNumber); }
补充说明
- 用
int c接收getchar()的返回值:因为getchar()返回的是int类型(可以表示普通字符或者EOF,EOF是一个特殊整数,不属于字符范围),用char存储可能会导致判断错误。 - 加上
c != EOF的判断:防止用户输入EOF时,getchar()一直返回EOF,导致内层循环无限执行。 - 如果你的场景不需要处理EOF,也可以简化成
while(getchar() != '\n');,但保留EOF判断会让程序更健壮。
内容的提问来源于stack exchange,提问作者royabousamra
相关产品推荐
相关产品推荐

