Why does the message print twice?

后端 未结 4 1223
灰色年华
灰色年华 2021-01-15 01:29

I am creating a simple Tic Tac Toe for C, and here is a particular function which I am having a problem with. This is supposed to let the user select \'X\' or \'O\', and fo

相关标签:
4条回答
  • 2021-01-15 01:58

    It's because when you use getchar it returns the next character, but leaves the newline in the input buffer. So the next getchar returns that newline.

    You should also be careful because getchar actually returns an int and not a char.

    You can solve this either by another getchar, or use scanf like this:

    scanf("%c ", &user);
    

    Note the space after the c in the above format, it tells scanf to read and disregard trailing whitespace.

    You could also read a line with e.g. fgets and then use a simple sscanf on that line, then no extra space is needed.

    0 讨论(0)
  • 2021-01-15 01:58

    The problem cause is related to the newline charachter

    use scanf() in this way instead of using getchar()

    scanf(" %c", &user);
    
    0 讨论(0)
  • You have a newline in your input buffer.

    When you press a character which is not [xX] and not [oO] and follow it with a newline. getchar actually gets to see 2 characters(the newline and the invalid character)

    You may want to use fgets instead of relying on character input and ignoring newlines with 2 getchar() calls everytime.

    0 讨论(0)
  • 2021-01-15 02:23

    You could fix it like this for example:

    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');     
    }
    
    0 讨论(0)
提交回复
热议问题