如何让C语言switch语句中A/B命令的参数错误提示正确触发?
解决Switch分支A/B的参数校验问题
现有代码的问题
- A分支:仅判断
scanf返回值是否为2,无法检测「多余参数」(比如输入A Mario 10.99 extra),多余内容会留在输入缓冲区,被下一次循环当成命令读取,导致逻辑混乱。 - B分支:把「参数数量错误」和「购买数量非法」的提示混在一起,输入
B Mario(缺参数)时,会错误提示Number of bought items cannot be less than 1.,而不是参数错误。 - 输入缓冲区未及时清理,导致残留内容干扰后续命令。
修改后的代码及解释
A分支修改
case 'A': // 添加新游戏 int ret_a = scanf("%s %f", name, &price); int c_a; // 跳过参数后的空白字符(空格、制表符) while ((c_a = getchar()) == ' ' || c_a == '\t'); // 两种情况触发参数错误提示: // 1. scanf没读到2个参数(0个或1个) // 2. 参数后还有非空白的多余内容 if (ret_a != 2 || (c_a != '\n' && c_a != EOF)) { printf("A should be followed by exactly 2 arguments.\n"); // 如果还有剩余内容,清空该行剩余部分 if (c_a != '\n' && c_a != EOF) { while ((c_a = getchar()) != '\n' && c_a != EOF); } } else { addGame(&games, &numGames, name, price); } break;
B分支修改
case 'B': // 购买游戏 int ret_b = scanf("%s %d", name, &count); int c_b; // 跳过参数后的空白字符 while ((c_b = getchar()) == ' ' || c_b == '\t'); // 先判断参数数量是否正确 if (ret_b != 2 || (c_b != '\n' && c_b != EOF)) { printf("B should be followed by exactly 2 arguments.\n"); // 清空剩余行内容 if (c_b != '\n' && c_b != EOF) { while ((c_b = getchar()) != '\n' && c_b != EOF); } } // 参数数量正确的前提下,再判断购买数量是否合法 else if (count <= 0) { printf("Number of bought items cannot be less than 1.\n"); } else { buyGame(games, numGames, name, count); } break;
关键逻辑说明
- 清空缓冲区:每次处理完命令后,清空当前行剩余的输入内容,避免残留的字符被下一次循环的
scanf(" %c", &command)误读成命令。 - 参数完整性校验:读完指定参数后,检查后续是否有非空白的多余内容,确保用户输入的参数数量恰好为2个。
- 错误提示分离:把「参数数量错误」和「数值非法」的提示分开,让用户明确知道哪里出错了。
内容的提问来源于stack exchange,提问作者Ronja Oksanen
相关产品推荐
相关产品推荐

