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

如何让C语言switch语句中A/B命令的参数错误提示正确触发?

解决Switch分支A/B的参数校验问题

现有代码的问题

  1. A分支:仅判断scanf返回值是否为2,无法检测「多余参数」(比如输入A Mario 10.99 extra),多余内容会留在输入缓冲区,被下一次循环当成命令读取,导致逻辑混乱。
  2. B分支:把「参数数量错误」和「购买数量非法」的提示混在一起,输入B Mario(缺参数)时,会错误提示Number of bought items cannot be less than 1.,而不是参数错误。
  3. 输入缓冲区未及时清理,导致残留内容干扰后续命令。

修改后的代码及解释

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 22:37:10