C语言学习笔记-20260618字符串子串查找
一、学习目标
掌握在C语言中查找子字符串的两种实现方式:手动模拟实现和调用标准库函数,理解各自的优缺点及适用场景。
二、方案一:手动模拟实现
2.1 核心思路
采用双重循环的暴力匹配算法:
外层循环遍历主字符串的每个起始位置,
内层循环从当前起始位置开始逐字符与子串进行比对。
当子串的所有字符都匹配成功时,返回当前起始位置的下标。
2.2 代码解析
int findSubStr(const char* str, const char* sub)
{
// 边界处理:子串为空直接返回0
if (*sub == '\\0')
return 0;
int i = 0;
while (str[i] != '\\0')
{
int j = 0;
// 从i位置开始逐字符匹配,同时防止越界
while (str[i + j] != '\\0' && sub[j] != '\\0' && str[i + j] == sub[j])
{
j++;
}
// 子串全部匹配完成(遇到'\\0'说明匹配成功)
if (sub[j] == '\\0')
return i;
i++;
}
// 遍历完主串仍未找到,返回-1
return –1;
}
2.3 关键细节
- 空子串处理:子串为空字符串时,约定返回下标0,避免后续逻辑出错。
- 三重终止条件:内层循环的while条件中,str[i + j] != '\\0'防止主串越界,sub[j] != '\\0'防止子串越界,str[i + j] == sub[j]进行字符比对,三者缺一不可。
- 成功判定:当sub[j] == '\\0'时,说明子串所有字符均已匹配完毕,此时i即为目标下标。
- 失败返回:约定未找到时返回-1,因为合法下标不可能为负数,便于调用方判断。
三、方案二:调用标准库函数 strstr
3.1 函数原型
char* strstr(const char* haystack, const char* needle);
- haystack:被检索的主字符串
- needle:待查找的子字符串
- 返回值:找到则返回指向子串首次出现位置的指针,未找到返回NULL
3.2 代码解析
char* res = strstr(str, sub);
if (res == NULL)
{
printf("无匹配子串\\n");
}
else
{
int idx = res – str; // 指针相减得到下标
printf("匹配起始下标:%d\\n", idx);
}
3.3 核心技巧:指针相减求下标
strstr返回的是指针而非下标,利用C语言指针运算的特性,res – str直接得到子串在主串中的偏移量(下标)。这是指针运算的经典应用场景。
3.4 注意事项
- 使用前必须包含#include <string.h>
- 返回值为NULL时不可解引用,必须先判空
- strstr是区分大小写的精确匹配

