如何用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
相关产品推荐
相关产品推荐

