char player_select(void){
char player = 'n';
while(player == 'n'){
printf("Select your player (X or O): ");
scanf("%cn", &player);
if(player != 'X' && player != 'O'){
printf("Invalid input. Try again.n");
player = 'n';
}
}
printf("Your character input is: %cn", player);
exit(0);
return player;
}
我在这里得到了一些奇怪的输出:
选择您的播放器(X 或 O):X
输入无效。再试一次。
选择您的播放器(X 或 O):i
您的字符输入是:X
scanf()
使用不正确
// scanf("%cn", &player);
scanf(" %c", &player);
"%cn"
中的'n'
不会按照您的想法行事。 'n'
告诉scanf()
像'n'
和' '
一样使用空格,直到出现非空格。 您的输入与描述不符。
由于stdin
是缓冲的,因此文本本身通常不会在随后出现'n'
之前被读取。
详细解释事情失败的原因变得很复杂。 简而言之,使用" %c"
而不是"%cn"
。 或者更好的是,使用 fgets()
.
buffer player[10];
fgets(ch, sizeof ch, stdin);
if(player[0] != 'X' && player[0] != 'O') { ...
我希望这对你有用。我已经删除了scanf
内的n
,并添加了用于清空stdin
while(getchar()!='n');
.
char player_select(void){
char player = 'n';
while(player == 'n'){
printf("Select your player (X or O): ");
scanf("%c", &player);
if(player != 'X' && player != 'O'){
printf("Invalid input. Try again.n");
player = 'n';
}
while(getchar()!='n');
}
这是输出:
Select your player (X or O): A
Invalid input. Try again.
Select your player (X or O): X
Your character input is: X
尝试:
if (scanf("%cn", &player) == 1 && player != 'X' && player != 'O'){
printf("Invalid input. Try again.n");
player = 'n';
}
将scanf
带入if
,从上面的代码中删除,并检查其返回值 == 1
。
如果这还不够,您可以尝试从 scanf 掩码中删除n
。