c - C - 当输入不是 int 时,提示用户输入有效的 int 会导致无限循环
问题描述
int main(void) {
int x;
do {
printf("Height: ");
} while(!((scanf("%d", &x)) == 0) && !(x > 0 && x < 23));
}
我想简单地提示用户输入 0 到 23 之间的数字,如果输入无效(不是 int 或超出范围),我想再次提示,直到他们正确为止。但是,当我第一次输入无效整数时,我会在无限循环中一遍又一遍地打印“高度”。在输入有效之前如何提示他们?
当我输入一个超出范围的数字时它可以工作,但当我输入一个像“abc”这样的字符串时它就不行了
解决方案
scanf
当且仅当用户输入了可以转换为int
.
如果scanf
不返回 1,那么您的工作就是清除流,以便可以读入另一个值。您可以使用惯用语来做到这一点
{
int c;
while ((c = getchar()) != '\n' && c != EOF);
}
正是您没有做的第二件事似乎导致您的代码无休止地打印。
还有更简洁的方法,但这是一个起点:
int main(void) {
int x;
do {
printf("Height: ");
if (scanf("%d", &x) != 1){
// invalid input, clear the stream and go round again.
int c;
while ((c = getchar()) != '\n' && c != EOF);
continue;
}
} while (x < 0 || x > 23);
return x;
}
(有些人不喜欢像while
我这样写的空循环。如果不符合您的口味,请进行相应调整:有些公司会禁止它。)
推荐阅读
- javascript - Angular/Firebase 应用程序不断显示上一页的数据
- python-3.x - Python Selenium 没有点击链接?
- node.js - 使用类验证器执行一些自定义异步验证
- javascript - 正则表达式 - 获取字符后的字符串
- python - Flask 应用程序的 Heroku 部署 - ModuleNotFoundError: No module named 'app'
- c# - 尝试通过 Windows 服务 C# 中的 office365 帐户发送电子邮件
- java - LOG4J 2 不刷新消息尾端
- android - 如果我使用 jarsigner 签署 AAB,我是否需要在部署之前签署 APKS 以及生成的 APK?
- python - VS Code Flask 调试
- wireshark - Wireshark 不显示 QUIC 协议