<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="adduser.php" method="POST" id="registerCandidates" enctype="multipart/form-data">
<div class="form-group">
<input class="form-control input-lg" type="password" id="password" name="password" placeholder="Password *" required>
</div>
<div class="form-group">
<input class="form-control input-lg" type="password" id="cpassword" name="cpassword" placeholder="Confirm Password *" required>
</div>
<div id="passwordError" class="btn btn-flat btn-danger hide-me">
Password Mismatch!!
</div>
<div class="form-group">
<button type="submit" class="btn btn-flat btn-success" name="register">Register</button>
</div>
</form>
我想简单地提示用户输入0到23之间的数字,如果输入无效(不是int或超出范围),我想再次提示,直到他们做对了。但是,第一次输入无效的整数时,我得到了#34; Height&#34;在无限循环中一遍又一遍地打印。如何在输入有效之前提示它们?
当我输入超出范围的数字时,它会起作用,但是当我输入类似&#34; abc&#34;
的字符串时,它不起作用答案 0 :(得分:2)
scanf
的内容时, int
才会返回1。
如果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
循环。如果不符合您的口味,请相应调整:有些公司禁止它。)
答案 1 :(得分:1)
您的错误在您的真相声明中。它应该类似于while (scanf("%d", &x) == 1 && (x < 0 && x > 23))
。 scanf
返回成功分配的变量数。#
但是我建议你读取循环语句本身的值,而不是真实语句。当它出现在真相声明中并且你已经陷入了陷阱时,很难推理它。