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
相关产品推荐
相关产品推荐

