C语言 在 while 循环中扫描字符


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

最新更新