为什么邮件打印两次?

时间:2013-07-27 13:36:33

标签: c while-loop

我正在为C创建一个简单的Tic Tac Toe,这是一个我遇到问题的特殊功能。这应该让用户选择'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 个答案:

答案 0 :(得分:4)

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

您还应该小心,因为getchar实际上会返回int而不是char

您可以通过其他getchar解决此问题,也可以像这样使用scanf

scanf("%c ", &user);

请注意上述格式的c之后的空格,它会告诉scanf读取并忽略尾随空格。

你也可以用例如fgets然后在该行上使用简单的sscanf,则不需要额外的空间。

答案 1 :(得分:3)

问题原因与新行字符

有关

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

scanf(" %c", &user);

答案 2 :(得分: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');     
}

答案 3 :(得分:1)

输入缓冲区中有换行符。

当您按下不是[xX]而不是[oO]的字符时,请按换行符。 getchar实际上会看到2个字符(换行符和无效字符)

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