我正在为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');
}
答案 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()调用忽略换行符。