引言
strstr函数是一个内置函数,用于在一个字符串(haystack)中查找另一个子字符串(needle)。当找到子字符串时,它会返回该子字符串在主字符串中的起始地址。今天,我们将通过一个自定义实现的
导图

代码举例
// 定义一个名为my_strstr的自定义函数,功能类似于C标准库中的strstr函数,用于在字符串p1中查找字符串p2
char* my_strstr(const char* p1, const char* p2) {
// 使用assert断言确保输入的两个字符串指针都不指向空字符,即都不是空字符串
assert(*p1 && *p2);
// 初始化三个字符指针:s1,s2和stu,其中stu初始指向p1的首地址
char* s1 = NULL;
char* s2 = NULL;
char* stu = (char*)p1;
// 特殊情况:如果p2为空字符串(只包含结束符' '),则返回p1的首地址
if (*p2 == ' ') {
return (char*)p1;
}
// 主循环,遍历字符串p1直到遇到结束符' '
while (*stu) {
// 将s1和s2分别指向stu和p2的当前字符,开始新一轮的比较
s1 = stu;
s2 = (char*)p2;
// 内部循环,逐个比较s1和s2指向的字符,如果相同则继续比较下一个字符
// 直到遇到任意一个字符串的结束符' '或者发现不相等的字符为止
while (*s1 && *s2 && (*s1 == *s2)) { // ' '的ASCII码值是0,视为假
s1++;
s2++;
}
// 如果s2已经指向结束符' ',则说明在stu开始的位置找到了子串p2,返回stu
if (*s2 == ' ') {
return stu; // 找到子串p2
}
// 如果s1已经指向结束符' ',说明当前stu所在子串长度不足以匹配p2,终止本次查找
if (*s1 == ' ') {
return NULL;
}
// 移动stu指针,使其指向下一个可能的子串起始位置
*stu++;
}
// 遍历结束后仍未找到子串p2,则返回NULL
return NULL; // 没找到
}
int main() {
// 定义两个字符串arr1和arr2作为测试数据
char* arr1 = "abcdabcd";
char* arr2 = "bcdaaaaaas";
// 调用自定义my_strstr函数查找arr1中是否存在arr2子串
const char* ret = my_strstr(arr1, arr2);
// 根据返回值判断查找结果
if (ret == NULL) {
printf("没找到");
} else {
printf("%s
", ret); // 输出找到的子串在主串中的起始位置
}
// 主函数返回0,表示程序正常执行完毕
return 0;
}
函数定义与参数介绍
函数实现步骤
-
初步校验与变量初始化 使用
assert 宏确保输入的主字符串和子字符串都不为空。然后初始化三个字符指针s1 、s2 和stu ,其中s1 和s2 将在后续用于遍历主字符串和子字符串,stu 初始设置为主字符串的起始地址。 -
处理特殊边界情况 如果子字符串
p2 的第一个字符就是结束符