模拟实现/讲解strcmp和strstr函数

目录

strcmp
strstr

传送门:strlen,strcpy,strcat



strcmp

首先我们需要了解strcmp函数的用法,

strcmp - Compare strings(比较字符串)

由于字符串的比较不能像整形那样直接用等号比较

	//这样比较是有问题的
	if ("abcd" > "abc")
		printf(">\n");
	else if ("abcd" < "abc")
		printf("<\n");
	else
		printf("==\n");

strcmp就是用来进行字符串比较

字符串的比较规则是将两个字符串的每一位进行对比,相等就走下一位,直到不相等的时候哪个字符串的元素大则该字符串更大。

例:
“abcd” < “abd”
“abcdef” > “abcd”

代码实现

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	//
	while (*str1 == *str2)
	{
		//进入循环证明此时*str1与*str2相等
		//*str1与*str2等于'\0'就返回零
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	/*if (*str1 > *str2)
		return 1;
	else
		return -1;*/
	return *str1 - *str2;
}

在这里插入图片描述

可以看出,strcmp的返回值是根据大小关系返回大于小于或等于0的数
所以我们不再使用if返回1或-1,直接使用*str1-*str2即可

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "dcba";
	printf("%d\n", strcmp(arr1, arr2));// -1
	printf("%d\n", my_strcmp(arr1, arr2));// -3

	//<
	if (my_strcmp(arr1, arr2) > 0)
		printf(">\n");
	else if (my_strcmp(arr1, arr2) < 0)
		printf("<\n");
	else
		printf("==\n");
	return 0;
}

调用上述代码,则会输出
-1
-3
<



strstr

strstr - Find a substring(找到子字符串)

char *strstr( const char *str1, const char *str2 );

实则找str2第一次出现在str1中的位置;

模拟实现时,尽量不直接改变*str1,*str2,额外定义指针进行改动

  1. 如果s1 != s2,则cp++,反之s1++,s2++
  2. 当cp移动后,将cp重新赋给s1,如果此时s2未到’\0’,则s2回到起始位置
char* my_strstr(const char* str1, const char* str2)
{
	char* s1 = NULL;
	char* s2 = NULL;
	char* cp = (char*)str1;

	//当cp走到'\0'函数都没有返回则证明找不到,返回空
	while (*cp)
	{
		s1 = cp;
		s2 = (char*)str2;

		//如果此时*s1或*s2该位置为'\0',或*s1 != *s2,退出下面循环(s1,s2不再后移)
		while (*s1 && *s2 && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
			return cp;
		cp++;
	}
	return NULL;
}

下面进行测试

int main()
{
	char arr1[] = "abbbcde";
	char arr2[] = "bbc";
	printf("%s\n", my_strstr(arr1, arr2));//bbcde
	char arr3[] = "abcdef";
	char arr4[] = "ce";
	printf("%s\n", my_strstr(arr3, arr4));//(null)
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值