3

我正在为 C 创建一个简单的井字游戏,这是一个我遇到问题的特定函数。这应该让用户选择“X”或“O”,并且它适用于大多数艺术。但是,如果我输入了错误的符号,它会打印语句:“无效的符号,请重新输入:”两次。

为什么以及如何解决这个问题?

char assign(void)                                 
{
      char user;

      printf("Would you like to be X or O (Enter your choice): ");
      user=getchar();
      while(user != 'X' && user != 'x' && user != 'O' && user != 'o')
      {
             printf("Invalid symbol, please re-enter: ");  
             user=getchar();
      }
      if(user == 'O' || user == 'o')        return('O');
      else if(user == 'X' || user == 'x')   return('X');     
}
4

4 回答 4

4

问题原因与换行符有关

scanf()以这种方式使用而不是使用getchar()

scanf(" %c", &user);
于 2013-07-27T13:44:16.560 回答
3

您可以像这样修复它,例如:

char assign(void)
{
      char user;
      char throwaway_newline;

      printf("Would you like to be X or O (Enter your choice): ");
      user=getchar();
      throwaway_newline = getchar();
      while(user != 'X' && user != 'x' && user != 'O' && user != 'o')
      {
             printf("Invalid symbol, please re-enter: ");  
             user=getchar();
             throwaway_newline = getchar();
      }
      if(user == 'O' || user == 'o')        return('O');
      else if(user == 'X' || user == 'x')   return('X');     
}
于 2013-07-27T13:49:43.040 回答
3

这是因为当您使用getchar它时,它会返回下一个字符,但会将换行符留在输入缓冲区中。所以下一个getchar返回该换行符。

您还应该小心,因为getchar实际上返回的是 anint而不是 a char

您可以通过另一个解决此问题getchar,也可以scanf像这样使用:

scanf("%c ", &user);

注意c上述格式中的空格,它告诉scanf读取和忽略尾随空格。

您也可以使用 eg 读取一行,fgets然后在该行上使用 simple sscanf,这样就不需要额外的空间。

于 2013-07-27T13:41:04.147 回答
1

您的输入缓冲区中有一个换行符。

当您按下一个不是 [xX] 且不是 [oO] 的字符并在其后加上换行符时。getchar实际上可以看到 2 个字符(换行符和无效字符)

您可能希望fgets每次都使用 2 个 getchar() 调用而不是依赖字符输入并忽略换行符。

于 2013-07-27T13:41:44.453 回答