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
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.
The problem cause is related to the newline charachter
use scanf()
in this way instead of using getchar()
scanf(" %c", &user);
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.
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');
}