循环无法正常运行

时间:2018-07-24 15:48:19

标签: c loops infinite

我正在尝试让我的循环接受用户输入,并且如果值是1到9,则循环结束(此部分工作正常)。但是,如果用户输入的数字不是1-9,则程序应显示一条错误消息,然后再次要求用户输入,然后重新检查输入的数字是否是1-9。输入字母“ g”,然后程序会无限期发出错误消息,而不是一次。为什么会这样?

代码如下:

int playerMove;

printf("Please enter a number 1 - 9:\n");

  for(;;)
  {
   scanf("%d", &playerMove);

    if(playerMove > 0 && playerMove < 10)
    {
      printf("\nYou have selected position %d. \n\n", playerMove);
      break;
    }

    else 
    {
      printf("Invalid selection. Please enter a number 1 - 9:\n");
    }
  }

2 个答案:

答案 0 :(得分:3)

scanf遇到与给定格式说明符不匹配的字符时,这些字符将保留在输入缓冲区中。 %d格式说明符期望使用十进制数字,因此一旦读取到非数字,它将停止读取。

通过输入“ g”,scanf调用不会读取任何内容,并且“ g”将留在缓冲区中。在后续迭代中也会发生同样的情况,从而导致无限循环。

改为使用fgets来读取一行文本,然后使用sscanf来尝试从该行中读取数字。如果返回1,则转换成功。如果返回0,则读取非数字输入,然后读取另一行:

for(;;) {
    char line[100];
    fgets(line, sizeof(line), stdin);
    int result = sscanf(line, "%d", &playerMove);

    if (result == 1 && playerMove > 0 && playerMove < 10)
        printf("\nYou have selected position %d. \n\n", playerMove);
        break;
    } else {
        printf("Invalid selection. Please enter a number 1 - 9:\n");
    }
}

答案 1 :(得分:0)

如果您不信任用户输入,则应将输入作为字符串读取(例如,带有gets),然后解析该字符串。