非数字输入导致无限循环

时间:2012-07-03 15:28:47

标签: c loops input do-while

出于某种原因,如果用户输入了错误的数据类型,例如“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);
}

2 个答案:

答案 0 :(得分:3)

如果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
{
}

答案 1 :(得分:1)

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

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