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

调用searchIt()函数退出异常:输入0无法终止程序问题求助

问题分析与修复:输入0无法退出程序的bug

问题根源

当在searchIt()中输入0时,函数仅break内部循环后返回0,但ch()的while(1)死循环没有终止判断,会直接跳过退出逻辑,继续执行库存修改流程,导致输入0后无法退出。另外原代码中searchIt()的count变量逻辑完全失效(初始化后未被修改),会错误地持续提示"Wrong item number!",不过这并非当前退出问题的直接原因。

修复方案

1. 重构searchIt()的返回值逻辑

让函数通过返回值明确传递退出信号:用**-1表示用户输入0要退出**,避免和合法数组下标0混淆,同时修正count变量的错误逻辑。

2. 在ch()中处理退出请求

调用searchIt()后先检查返回值,若为-1则直接break终止自身死循环,完成退出操作。

修改后的代码

修正后的searchIt()函数

int searchIt(Shop a[], int n) {
    while (1) {
        int itemN;
        printf("Itemnumber(0 to quit): ");
        scanf("%d", &itemN);
        if (itemN == 0) {
            return -1; // 返回-1标记退出请求
        }
        int count = 1; // 初始标记为未找到商品
        for (int i = 0; i < n; ++i) {
            if (itemN == a[i].itemN) {
                printf("%d\t\t%s\t\t%d\n", a[i].itemN, a[i].name, a[i].inv);
                count = 0; // 找到匹配项,重置标记
                return i;
            }
        }
        if (count) { // 未找到商品时提示错误
            printf("Wrong item number!\n");
        }
    }
}

修正后的ch()函数

void ch(Shop a[], int n) {
    while (1) {
        int input;
        const int i = searchIt(a, n);
        if (i == -1) { // 检测到退出请求,终止循环
            break;
        }
        printf("change inventory: ");
        scanf("%d", &input);

        a[i].inv += input;
        if (a[i].inv < 0) {
            printf("balance is now 0!\n");
            a[i].inv = 0;
        }
    }
    return;
}

关键修改说明

  • 用返回值-1传递退出意图,彻底区分"退出操作"和"下标为0的商品",避免逻辑混淆。
  • ch()函数增加返回值判断,收到退出信号后立即终止循环,实现正常退出。
  • 修复count变量逻辑,确保仅当输入的商品编号不存在时,才会提示"Wrong item number!"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:45:41