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

如何用scanf处理带参数/无参数的单行游戏命令输入?

解决混合格式命令输入的C语言方案

问题背景

开发迷你游戏时需接收单行操作命令,命令分为两类:

  • 「字符串+数字」格式:如atk 1、health 1
  • 纯字符串格式:如show、none、end
    原代码使用scanf("%s %d")处理输入,无法兼容纯字符串命令,导致程序异常。

方案1:读取整行后拆分解析

先用fgets()读取完整输入行,再通过sscanf()判断输入是否包含数字,按需解析命令和参数,同时避免scanf残留换行符的问题。

修改后核心代码

while((you.hp > 0)&&(enemy.hp > 0) )
{
    char input[MAXSIZE * 2];
    fgets(input, sizeof(input), stdin);
    // 自动去除换行符
    input[strcspn(input, "\n")] = '\0';

    char move[MAXSIZE];
    int damage = 0;
    // 尝试按「字符串+数字」格式解析,返回值为成功匹配的参数个数
    int parse_count = sscanf(input, "%s %d", move, &damage);

    if (parse_count == 1) {
        // 仅匹配到字符串,处理纯命令
        if (strcmp(move, "none") == 0) {
            round++;
        } else if (strcmp(move, "show") == 0) {
            printf("%s %d %s %d\n", you.name, you.hp, enemy.name, enemy.hp);
            continue;
        } else if (strcmp(move, "end") == 0) {
            break;
        } else {
            printf("无效命令\n");
            break;
        }
    } else if (parse_count == 2) {
        // 匹配到字符串+数字,处理带参数命令
        if (strcmp(move,"atk") == 0 ) {
            if((round%2) == 0)
                enemy.hp -= damage;
            else
                you.hp -= damage; // 修复原代码赋值错误
            round++;
        } else if( strcmp(move,"health") == 0 ) {
            you.hp += damage;
            round++;
        } else if( strcmp(move,"poison") == 0 ) {
            poison += damage;
            round++;
        } else {
            printf("无效命令\n");
            break;
        }
    } else {
        printf("无效输入\n");
        break;
    }
}

方案2:先读命令,按需读取参数

先仅读取命令字符串,再根据命令类型判断是否需要读取后续数字,逻辑更直观,避免scanf因缺少参数阻塞。

修改后核心代码

while((you.hp > 0)&&(enemy.hp > 0) )
{
    char move[MAXSIZE];
    int damage = 0;
    // 先读取命令字符串
    scanf("%s", move);

    // 判断是否需要读取数字参数
    if (strcmp(move,"atk") == 0 || strcmp(move,"health") == 0 || strcmp(move,"poison") == 0) {
        scanf("%d", &damage);
        // 处理带参数命令
        if (strcmp(move,"atk") == 0) {
            if((round%2) == 0)
                enemy.hp -= damage;
            else
                you.hp -= damage; // 修复原代码赋值错误
            round++;
        } else if(strcmp(move,"health") == 0) {
            you.hp += damage;
            round++;
        } else if(strcmp(move,"poison") == 0) {
            poison += damage;
            round++;
        }
    } else {
        // 处理纯字符串命令
        if( strcmp(move,"none") == 0 ) {
            round++;
        } else if( strcmp(move,"show") == 0) {
            printf("%s %d %s %d\n", you.name, you.hp, enemy.name, enemy.hp);
            continue;
        } else if( strcmp(move,"end") == 0) {
            break;
        } else {
            printf("无效命令\n");
            break;
        }
    }
}

方案3:正则表达式匹配(进阶)

如果后续命令格式更复杂,可使用C语言的regex.h库匹配输入行,精准提取命令和参数。但对于当前简单场景,前两种方案已足够高效。


额外修复提示

原代码中you.hp = you.hp = damage;是逻辑错误,应改为you.hp -= damage;,否则玩家HP会被直接设置为伤害值,导致战斗逻辑混乱。

内容的提问来源于stack exchange,提问作者Jack C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:20:58