C语言.之strstr函数的实现,判断字符串1包含字符串2

C语言strstr函数的实现,判断字符串1包含字符串2

  1. strstr函数的介绍
    函数声明如下:
char * strstr ( const char * str1, const char * str2 );    

strstr函数是用于在字符串str1中找str2字符串第一次出现的位置,如果找到改位置,则将这个位置返回,找不到则返回一个空指针NULL
strstr函数比较元素时,不包含 \0,以 \0 作为结束的标志

在这里插入图片描述
在这里插入图片描述

通过比较s1 和 s2 的元素,判断是否相符合,如果不符合s1 回到 str1的位置, s2回到 str2 的位置
然后str1++找到下一个元素,从这个元素开始比较,当s2指向\0的时候,则返回str1的地址,我们也可以定义一个cur来存放str1的地址,这样比较清晰一点

#include <stdio.h>
#include <string.h>
#include <assert.h>

char* my_strstr(const char* str1, const char* str2)
{
	const char* cur = str1;  //用cur用来记录当前的位置
	const char* s1 = NULL;   //通过s1 和 s2 比较元素
	const char* s2 = NULL;
	assert(str1 && str2);    //assert断言,如果传入的地址有有一个会空指针,则直接返回str1的地址
	if (str2 == '\0')
		return (char*)str1;
	while (*cur)   //当cur中的值不为'\0'时,进入循环
	{
		s1 = cur;   //s1回到比较时的位置
		s2 = str2;  //s2回到初始位置
		while (*s1 && *s2 && *s1 == *s2) //当s1和s2指向的值相等时,进入循环
		{
			s1++;  //找到下一个元素
			s2++;  //找到下一个元素
			//再次比较
		}
		if (*s2 == '\0')  //当s2中的元素为'\0'时,则说明在str1中找到了str2
			return (char*)cur; //返回当前的位置
		cur++; //第一次没找到,找到下一个元素重新寻找
	}
	return NULL; //如果在循环中没有找到,则返回一个空指针
}

int main()
{
	char arr1[] = "abcadefdef";
	char arr2[] = "def";
	char* ret = my_strstr(arr1, arr2);
	if (ret != NULL)
	{
		printf("%s\n", ret);
	}
	else
	{
		printf("找不到\n");
	}
	return 0;
}

方法2

#include <stdio.h>
#include <stdbool.h> // 引入bool类型定义
 
bool contains(const char *str1, const char *str2) {
    const char *tmp = str1; // 保存原始指针位置,以便在未找到时重置
    while (*str1) { // 遍历字符串1直到结束
        int found = 1; // 假设当前位置能找到str2
        const char *s1 = str1, *s2 = str2; // 分别指向当前检查的str1和str2的起始位置
        while (*s2) { // 遍历字符串2直到结束
            if (*s1++ != *s2++) { // 如果字符不匹配,则标记为未找到,并跳出内层循环
                found = 0;
                break;
            }
        }
        if (found) return true; // 如果全部字符都匹配,返回true
        str1++; // 移动到str1的下一个字符,继续搜索
    }
    return false; // 如果未找到,返回false
}
 
int main() {
    char str1[] = "Hello, world!";
    char str2[] = "world";
    
    if (contains(str1, str2)) {
        printf("字符串1包含字符串2。\n");
    } else {
        printf("字符串1不包含字符串2。\n");
    }
    
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值