使用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); } } } } }
修复说明
- 修正
scanf参数,直接使用数组名ItmName作为接收地址,避免指针错误。 - 移除嵌套的无效循环,改为单次遍历数组,对每个条目做子串匹配判断。
- 将判断条件改为
strstr(...) != NULL,正确识别包含目标内容的商品。 - 删除else块末尾的
return,让函数保持循环,直到用户输入q才退出。
内容的提问来源于stack exchange,提问作者lata27
相关产品推荐
相关产品推荐

