输入验证C中的整数

时间:2019-01-07 11:04:38

标签: c

this answer中所述:

  

num将始终包含整数,因为它是int。代码的真正问题是您不检查scanf返回值。 scanf返回成功读取的项目数,因此在这种情况下,它必须返回1以获取有效值。如果不是,则输入一个无效的整数值,并且num变量可能不会被更改(即,由于您没有初始化它,所以它仍然具有任意值)。

     

根据您的评论,您只希望允许用户输入一个整数,然后按Enter键。不幸的是,scanf("%d\n")不能简单地实现这一点,但这是一个技巧:

  int num;
  char term;
  if(scanf("%d%c", &num, &term) != 2 || term != '\n')
      printf("failure\n");
  else
      printf("valid integer followed by enter key");

我看到这篇文章很好地工作了,但是在do-while循环中不起作用。我需要从用户那里获取直到正确的输入,但是当第一次执行循环时,它会持续打印失败而没有从用户那里获取。

出什么问题了?

1 个答案:

答案 0 :(得分:1)

问题是没有从输入缓冲区中清除有问题的字符。如果要清除直到出现错误后的第一个行尾,则必须明确地执行此操作:

int num;
char term;
for (;;) {
  if(scanf("%d%c", &num, &term) != 2 || term != '\n') {
      printf("failure\n");
      int c;
      while (('\n' != (c=fgetc(stdin))) && (c != EOF));   // clear up to end of line
      if (c == EOF) break;     // do not read past EOF...
  }
  else { 
      printf("valid integer followed by enter key");
      break;
  }
}