C语言实现字符串模糊查询(子串匹配)
在C语言开发中,模糊查询通常指检测目标字符串是否包含特定的子串序列。相比于正则表达式等高级方案,基于标准库函数 memchr 和 memcmp 的组合不仅能高效完成此任务,还能清晰展示底层内存比较的运作机制。
核心方法与原理
实现该功能的关键在于两步操作:
- 快速定位起点:使用
memchr()扫描目标字符串,寻找子串的第一个字符。如果找不到该首字符,则整个子串必然不存在。 - 精确匹配片段:一旦找到可能的起点,立即使用
memcmp()从该位置开始,按子串的长度逐一比对后续的字符。
第1步:环境准备与输入定义
首先引入必要的头文件,并构建输入缓冲区。需要注意 fgets() 会保留换行符,因此实际参与比对的有效长度需要扣除换行位。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, const char * argv[])
{
char str[] = "hello welcome to china\0"; //源字符串
printf("input a string:\n");
char str2[20]; //要查找的字符串
fgets(str2, 19, stdin); //读取输入
第2步:初步搜索与异常拦截
提取用户输入的首个字符,并在主串中进行首次查找。若返回值为NULL,说明连开头都没有,直接结束程序。
char *res;
res = memchr(str, str2[0], strlen(str)); //根据要查找的字符串第一个字符,切割源字符串
if (res == NULL)
{
printf("find nothing...\n");
return 0;
}
第3步:循环比对与边界处理
进入死循环持续比对。在此处必须处理两种情况:
1. 完全匹配成功,即 memcmp 返回0。
2. 当前位置不足以为子串提供剩余空间,需将指针后移一位,继续向下尝试。
int n;
while (1)
{
n = memcmp(res, str2, strlen(str2) - 1); //比较
if (n != 0)
{
if (strlen(res) <= strlen(str2)) //切割出的字符串小于要查找字符串的长度
{
printf("find nothing...\n");
return 0;
}
else
{
//根据要查找的第一个字符继续切割
res = memchr(res + 1, str2[0], strlen(res));
if (res == NULL)
{
printf("find nothing...\n");
return 0;
}
}
}
else
{ //如果n = 0,找到
printf("%s is found..\n", str2);
return 0;
}
}
}
总结
上述代码展示了如何利用 C语言 原生接口构建最基础的字符串模糊查询逻辑。通过先锁定关键点再逐字节校验的策略,既保证了效率也明确了执行流程。
以上就是C语言之字符串模糊查询方法的实现的详细内容,更多关于C语言基础编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









