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

编写石头剪刀布游戏时,while循环内printf重复输出问题求助

石头剪刀布C程序printf重复输出问题解决

问题描述

编写石头剪刀布游戏的C语言程序时,首次运行正常,但进入while循环第二次迭代时,printf("enter r 3 for rock or c 1 for scissors or p 2 for paper :\n");语句会重复输出。

原代码

#include <stdlib.h>
#include <time.h>
#include <stdio.h>
int choicep(char choice){
    if (choice=='c')
    {
        return 1;
    }else if (choice=='p')
    {
        return 2;
    }
    else if(choice=='r'){
        return 3;
    }
}

int main(){
    srand(time(NULL));
    char player choice;
    int playerscore=0,computer=0;
    int choice,computer choice;
    while (playerscore != 3 && computer!= 3)
    {
        printf("enter r 3 for rock or c 1 for scissors or p 2 for paper :\n");
        scanf("%c",&player choice);
        choice = choice p(player choice);
        computer choice = (rand() % 3 )+1;
        if (computer choice==1)
        {
            switch (choice)
            {
            case 1:
                printf("draw !\n");
                break;
            case 2:
                printf("computer win \n");
                break;
            case 3:
                printf("player win \n");
                break;
            default:
                break;
            }
        }
        if (computerchoice==2)
        {
            switch (choice)
            {
            case 2:
                printf("draw !\n");
                break;
            case 3:
                printf("computer win\n ");
                break;
            case 1:
                printf("player win ");
                break;
            default:
                break;
            }
        }
        if (computer choice==3)//r
        {
            switch (choice)
            {
            case 3:
                printf("draw !\n");
                break;
            case 1:
                printf("computer win \n");
                break;
            case 2:
                printf("player win\n ");
                break;
            default:
                break;
            }
        }
    }
    return 0;
}

问题原因

  1. 输入缓冲区残留换行符:使用scanf("%c", &player_choice)读取字符时,第一次输入字符后按下的换行符\n会留在输入缓冲区。第二次循环时,scanf直接读取这个换行符,而非等待用户输入,导致printf重复输出。
  2. 语法错误:原代码中变量名包含空格(如player choice、computer choice),属于非法命名,无法通过编译;choicep函数未处理非法输入,会引发未定义行为;没有更新得分的逻辑,循环永远无法终止。

解决方案

  1. 清除输入缓冲区空白字符:将scanf格式改为" %c"(%c前的空格会自动跳过所有空白字符,包括换行、空格)。
  2. 修正非法变量名:将带空格的变量名改为下划线连接的合法命名(如player_choice、computer_choice)。
  3. 完善函数逻辑:给choicep函数添加非法输入的返回值,避免未定义行为。
  4. 补充得分更新逻辑:让循环能正常终止,完善游戏流程。

修正后的代码

#include <stdlib.h>
#include <time.h>
#include <stdio.h>

int choice_p(char choice){
    if (choice == 'c') {
        return 1;
    } else if (choice == 'p') {
        return 2;
    } else if (choice == 'r') {
        return 3;
    }
    // 返回0标识无效选择
    return 0;
}

int main(){
    srand(time(NULL));
    char player_choice;
    int player_score = 0, computer_score = 0;
    int player_choice_num, computer_choice;
    
    while (player_score != 3 && computer_score != 3) {
        printf("enter r (3) for rock or c (1) for scissors or p (2) for paper:\n");
        // 跳过空白字符,读取有效输入
        scanf(" %c", &player_choice);
        player_choice_num = choice_p(player_choice);
        
        // 处理无效输入
        if (player_choice_num == 0) {
            printf("Invalid choice! Please enter r, c, or p.\n");
            continue;
        }
        
        computer_choice = (rand() % 3) + 1;
        
        // 判断胜负并更新得分
        if (computer_choice == 1) { // 电脑出剪刀
            switch (player_choice_num) {
                case 1:
                    printf("Draw!\n");
                    break;
                case 2:
                    printf("Computer wins!\n");
                    computer_score++;
                    break;
                case 3:
                    printf("Player wins!\n");
                    player_score++;
                    break;
            }
        } else if (computer_choice == 2) { // 电脑出布
            switch (player_choice_num) {
                case 2:
                    printf("Draw!\n");
                    break;
                case 3:
                    printf("Computer wins!\n");
                    computer_score++;
                    break;
                case 1:
                    printf("Player wins!\n");
                    player_score++;
                    break;
            }
        } else if (computer_choice == 3) { // 电脑出石头
            switch (player_choice_num) {
                case 3:
                    printf("Draw!\n");
                    break;
                case 1:
                    printf("Computer wins!\n");
                    computer_score++;
                    break;
                case 2:
                    printf("Player wins!\n");
                    player_score++;
                    break;
            }
        }
        
        printf("Current Score - Player: %d, Computer: %d\n\n", player_score, computer_score);
    }
    
    // 输出最终结果
    if (player_score == 3) {
        printf("Congratulations! You won the game!\n");
    } else {
        printf("Computer won the game! Better luck next time.\n");
    }
    
    return 0;
}

内容的提问来源于stack exchange,提问作者Abdel djalil Boulebbina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 12:50:15