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

C语言CRUD通讯录搜索功能及前缀匹配实现问题求助

通讯录搜索模块问题修复

现有代码的核心问题

  • 搜索输入逻辑错位:当前将scanf获取搜索关键词的代码放在了遍历联系人的for循环内部,有多少个联系人就会要求用户输入多少次关键词,逻辑完全错误
  • 匹配规则不符合需求:使用strcmp做全量字符串匹配,只能匹配完全相同的姓名,无法实现前缀匹配效果
  • 输出逻辑错误:每遍历一个联系人就输出一次「找到/未找到」,没有统一汇总匹配结果,会输出大量无效内容
  • 缓冲区长度不统一:搜索关键词数组searchedName长度定义为30,小于联系人姓名的最大长度MAX_LENGTH=50,存在输入越界风险

修复后的代码

替换原有的SearchContact函数即可实现前缀搜索功能:

void SearchContact(ContactBook **c, int quant)
{
    int i, matchCount = 0;
    char searchedName[MAX_LENGTH]; // 统一用MAX_LENGTH避免越界

    // 先获取一次搜索关键词,再遍历所有联系人匹配
    printf("\n 输入要搜索的姓名前缀: \n");
    scanf("%s", searchedName);
    getchar();
    int prefixLen = strlen(searchedName);

    printf("\n 匹配结果:\n");
    for (i = 0; i < quant; i++)
    {
        // 用strncmp只比对前缀长度的字符,实现前缀匹配
        if (strncmp(searchedName, c[i]->name, prefixLen) == 0)
        {
            printf("\t生日: %2d月%s\t 姓名: %s \t 手机号: %s\n", c[i]->bd, c[i]->bdm, c[i]->name, c[i]->number);
            matchCount++;
        }
    }

    if (matchCount == 0)
    {
        printf("\t未找到匹配的联系人\n");
    }
}

可选优化

如果需要支持大小写不敏感的前缀匹配,可以在比对前统一将搜索关键词和联系人姓名转为全小写/全大写,再调用strncmp比对即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:06:06