C语言实现字符串模糊查询(子串匹配)

Ryan
Ryan
发布时间:2026-10-13 | 5人浏览过
原创

在C语言开发中,模糊查询通常指检测目标字符串是否包含特定的子串序列。相比于正则表达式等高级方案,基于标准库函数 memchr 和 memcmp 的组合不仅能高效完成此任务,还能清晰展示底层内存比较的运作机制。

核心方法与原理

实现该功能的关键在于两步操作:

  1. 快速定位起点:使用 memchr() 扫描目标字符串,寻找子串的第一个字符。如果找不到该首字符,则整个子串必然不存在。
  2. 精确匹配片段:一旦找到可能的起点,立即使用 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语言基础编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表