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

使用strstr实现商品名称模糊查询遇阻,求代码排查解决

问题排查与修复

代码中的核心问题

  • scanf传参错误:scanf("%s%*c", &ItmName); 中ItmName是数组名,本身就是指针,不需要&,且%*c会额外读取一个字符,可能导致后续输入异常。
  • 嵌套循环重置索引:外层遍历数组的for(i=0;i<nr;i++)内,又重新初始化i进入内层循环,导致外层循环逻辑失效,索引完全混乱。
  • 判断条件无效:if(word==itemN) 是错误逻辑——itemN未定义,且正确判断应该是strstr返回的指针不为NULL(即找到目标子串)。
  • 提前退出函数:else块末尾的return会让程序处理一次查询后直接退出,无法循环接收用户输入。

修正后的代码

#include <stdio.h>
#include <string.h>

// 假设Car结构体定义如下(需根据实际项目调整)
typedef struct {
    int itemNmr;
    char name[50];
    int inventory;
} Car;

void search(Car a[], int nr) {
    char ItmName[50];
    int i;

    while (1) {
        printf("Type item name (q for menu): ");
        // 修正scanf传参,移除多余的&和%*c,避免输入异常
        scanf("%s", ItmName);

        if (strcmp(ItmName, "q") == 0) {
            return;
        } else {
            // 遍历所有商品条目,逐一判断是否包含目标子串
            for (i = 0; i < nr; i++) {
                if (strstr(a[i].name, ItmName) != NULL) {
                    printf("%d\t\t%s\t\t%d\n", a[i].itemNmr, a[i].name, a[i].inventory);
                }
            }
        }
    }
}

修复说明

  1. 修正scanf参数,直接使用数组名ItmName作为接收地址,避免指针错误。
  2. 移除嵌套的无效循环,改为单次遍历数组,对每个条目做子串匹配判断。
  3. 将判断条件改为strstr(...) != NULL,正确识别包含目标内容的商品。
  4. 删除else块末尾的return,让函数保持循环,直到用户输入q才退出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:56:03