当输入不是int时,C - 提示用户输入有效的int会导致无限循环

时间:2018-06-14 05:36:39

标签: c scanf

<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;

的字符串时,它不起作用

2 个答案:

答案 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返回成功分配的变量数。#

但是我建议你读取循环语句本身的值,而不是真实语句。当它出现在真相声明中并且你已经陷入了陷阱时,很难推理它。