【问题标题】:Loop is not working correctly循环无法正常工作
【发布时间】:2019-01-01 07:49:18
【问题描述】:

我试图让我的循环接受用户输入,如果值为 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");
    }
  }

【问题讨论】:

  • 你怎么知道你打电话给scanf() 真的有效?您忽略了返回值。
  • scanf 期待一个整数输入 (%d) 而你给它一个非整数值时,你会假设会发生什么?
  • @rdowell 我假设它将采用 ascii 字符的十进制值,在本例中为 'g',即 103,并使用该值。这是不正确的吗?
  • @JulianBraha 如果是这种情况,那么“1”将被读取为 49,这是该字符的 ascii 代码。

标签: c loops infinite


【解决方案1】:

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");
    }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-12-02
      • 2013-08-09
      • 2013-10-30
      • 2013-10-19
      • 2017-02-03
      • 2017-11-11
      相关资源
      最近更新 更多