C_Intermediate_Learner
C_Intermediate_Learner

Reputation: 1820

Why does the message print twice?

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 for the most art it works. However, if I enter a wrong symbol, it prints the statement: "Invalid symbol, please re-enter: " twice.

Why and how can I fix this?

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

Upvotes: 3

Views: 4946

Answers (4)

Lucas
Lucas

Reputation: 14129

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

Upvotes: 3

MOHAMED
MOHAMED

Reputation: 43518

The problem cause is related to the newline charachter

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

scanf(" %c", &user);

Upvotes: 4

bsd
bsd

Reputation: 2717

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.

Upvotes: 1

Some programmer dude
Some programmer dude

Reputation: 409136

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.

Upvotes: 3

Related Questions