验证C中的输入

时间:2016-06-07 19:42:09

标签: c input integer

我试图编写一个简单的二进制计算器来重新认识C.出于某种原因,第一次输入验证工作正常,即使数字的第二次验证以几乎相同的方式写入,如果用户输入错误输入,while循环无限循环,无需等待新用户输入。这是代码,感谢您的帮助。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
  char operator[20];
  char valid_operator[4] = "+-*/";
  printf("Enter operator: ");
  scanf("%s", operator);
  printf("You entered: %s\n", operator);
  while(strchr(valid_operator, (int)operator[0]) == NULL) {
    printf("%s is not a valid operator.  Enter +, -, /, or *: ", operator);
    scanf("%s", operator);
  }

代码一直在这里工作。如果用户第一次输入错误输入,则下一部分将被抛入无限循环。重新提示永远不会发生。

  int input1;
  int input2;
  printf("Enter the two inputs (separated by whitespace): ");
  int num_ints = 1;
  num_ints = scanf("%d %d", &input1, &input2);
  printf("Input 1: %d.  Input 2: %d.\n", input1, input2);
  while(num_ints < 2){
    printf("Invalid input.  Enter two integers separated by whitespace: ");
    num_ints = 0;
    num_ints = scanf("%d %d", &input1, &input2);
    printf("Input 1: %d.  Input 2: %d.\n", input1, input2);
  }
  return 0;

2 个答案:

答案 0 :(得分:1)

无限循环而不等待新用户输入的原因是scanf无法以请求的格式读取char(在您的情况下为%d)< strong>它不会提前文件指针,并且在循环的下一次迭代中,它将尝试再次读取相同的错误字符。

这与POSIX:http://pubs.opengroup.org/onlinepubs/009695399/functions/fscanf.html

一致
  

如果比较显示它们不相等,则指令失败,不同和后续字节将保持未读

此外,从man scanf

返回值
  

...返回成功匹配和分配的输入项的数量,可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。

因此,您最好将fgetssscanf合并。

do {
    char buf[BUFSZ];
    printf("Enter the two inputs (separated by whitespace): ");
    if(fgets(buf, BUFSZ, stdin) == NULL)
    {
        /* Error exit. */
        break;
    }
    num_ints = sscanf(buf, "%d %d", &input1, &input2);
} while(num_ints != 2);

答案 1 :(得分:0)

你需要清除标准输入。如果在示例“1 t”中输入非整数,则不会消耗“t”(在流中保留)。将其添加到循环中:

while(num_ints < 2){
   while (fgetc(stdin) != '\n'); // clear input
. . .

有关该问题的详细说明,请参阅C program loops infinitely after scanf gets unexpected data