You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言猜拳游戏循环问题求助:输入y重启游戏失败

问题分析与修复方案

问题出在C语言的输入缓冲区残留换行符上:scanf读取字符时不会自动跳过输入后的换行,这些残留的换行会被下一次scanf直接读取,导致程序跳过你的输入提示。

给你两种可行的修复方案:


方案一:在%c前添加空格

scanf的格式控制符里,%c前的空格会让它自动跳过所有空白字符(包括换行、空格、制表符),直接读取有效输入字符,完美避开残留换行的问题。修改所有读取字符的scanf语句即可:

#include<stdio.h>

int main (){
char firstPlayer, secondPlayer, again;
do{
printf("Jack 'n Poy\nEnter Player 1 input: ");
scanf(" %c", &firstPlayer); // %c前添加空格

printf("Enter Player 2 input: ");
scanf(" %c", &secondPlayer); // 同样添加空格

switch (firstPlayer){
    case 'x':
    switch (secondPlayer){
        case 'x':
        printf("Draw");
        break; 
        case 's':
        printf("Player 2 wins");
        break;
        case 'p':
        printf("Player 1 wins");
        
    }
    break;
     case 's':
     switch (secondPlayer){
        case 'x':
        printf("Player 1 wins");
        break;
        case 's':
        printf("Draw");
        break;
        case 'p':
        printf("Player 2 wins");
    }
    break;
     case 'p':
     switch (secondPlayer){
        case 'x':
        printf("Player 2 wins");
        break;
        case 's':
        printf("Player 1 wins");
        break;
        case 'p':
        printf("Draw");
     }
    break;
    default:
    printf("Invalid input");
    
}
    printf("\nPlay again? (y/n)");
    scanf(" %c", &again); // 此处也添加空格
}
while (again == 'y');
printf("Thank you for playing");

return 0;
}

方案二:手动清理输入缓冲区

每次用scanf读取字符后,调用循环把缓冲区里的残留字符(直到换行)全部清空,彻底避免残留字符影响下一次输入:

#include<stdio.h>

int main (){
char firstPlayer, secondPlayer, again;
do{
printf("Jack 'n Poy\nEnter Player 1 input: ");
scanf("%c", &firstPlayer);
while(getchar() != '\n'); // 清理缓冲区到换行符为止

printf("Enter Player 2 input: ");
scanf("%c", &secondPlayer);
while(getchar() != '\n'); // 同样清理缓冲区

switch (firstPlayer){
    case 'x':
    switch (secondPlayer){
        case 'x':
        printf("Draw");
        break; 
        case 's':
        printf("Player 2 wins");
        break;
        case 'p':
        printf("Player 1 wins");
        
    }
    break;
     case 's':
     switch (secondPlayer){
        case 'x':
        printf("Player 1 wins");
        break;
        case 's':
        printf("Draw");
        break;
        case 'p':
        printf("Player 2 wins");
    }
    break;
     case 'p':
     switch (secondPlayer){
        case 'x':
        printf("Player 2 wins");
        break;
        case 's':
        printf("Player 1 wins");
        break;
        case 'p':
        printf("Draw");
     }
    break;
    default:
    printf("Invalid input");
    
}
    printf("\nPlay again? (y/n)");
    scanf("%c", &again);
    while(getchar() != '\n'); // 清理最后一次输入的缓冲区
}
while (again == 'y');
printf("Thank you for playing");

return 0;
}

额外说明

你原代码中第一个scanf("%c ", &firstPlayer);后面的空格会导致scanf等待非空白字符,反而会加重输入混乱,所以直接去掉该空格,改用上面两种方案之一即可。

内容的提问来源于stack exchange,提问作者Mr. Skadoosh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 21:45:28