非数字输入会导致死循环(Non-numerical input causes endless loo

2019-09-19 01:06发布

出于某种原因,如果用户输入错误的数据类型,如“J”或“%”,则循环将停止请求输入和将继续显示"Enter an integer >"一遍又一遍。 我怎样才能使程序处理不好的投入? 为什么不进入非数值事业等奇怪的行为?

#define SENTINEL 0;
int main(void) {
  int sum = 0; /* The sum of numbers already read */
  int current; /* The number just read */

  do {
    printf("\nEnter an integer > ");
    scanf("%d", &current);
    if (current > SENTINEL)
      sum = sum + current;
  } while (current > SENTINEL);
  printf("\nThe sum is %d\n", sum);
}

Answer 1:

如果scanf()无法找到匹配的输入,在current变量将保持不变:检查返回值scanf()

/* scanf() returns the number of assignments made.
   In this case, that should be 1. */
if (1 != scanf("%d", &current)) break;

如果你想输入无效后继续接受输入,需要无效的数据被读取stdin ,因为它会依然存在,如所指出的PMG中的注释。 一种可能的方式是使用格式说明"%*s"读取输入,但是不进行分配:

if (1 != scanf("%d", &current))
{
    scanf("%*s");
}
else
{
}


Answer 2:

一种方法是读输入一个字符串,然后将字符串转换为所需的数据类型。

我的C是有点生疏,但我记得使用fgets()读取字符串,然后sscanf()来解析/“读”串入我感兴趣的变量。



文章来源: Non-numerical input causes endless loop