学习模拟实现strlen strcmp strcpy strcat strstr等库函数

前言

今天我与大家分享一下几个处理字符和字符串的库函数,我会介绍他们的使用方法和注意事项,最后会带领大家一起模拟实现一下他们的功能,话不多说让我们开始今天的学习。

strlen

使用方法与注意事项

如果大家看过我的博客,相信对这个库函数已经非常的熟悉了,但是我们还是与大家分享一下他的用法。
在这里插入图片描述
我们从这个库函数的介绍可以知道,他是用来求字符串长度的,参数类型是const char*返回值类型是size_t。什么是size_t呢?我们可以在vs编译器里面查看
在这里插入图片描述
我们可以看到size_t是无符号整形的重命名,所以strlen的返回值是一个无符号整形strlen库函数在计算字符串长度时,只计算\0之前的字符,所以被计算字符串必须有\0。总结一下:

strlen
字符串已经\0作为结束标志,strlen函数返回的是在字符串中\0前面出现的字符个数(不包含\0
参数指向的字符串必须要以\0结束。
注意函数的返回值size_t,是无符号的。

了解了上面这些让我们来看一道题目

#include <stdio.h>
int main()
{
 const char*str1 = "abcdef";
 const char*str2 = "bbb";
 if(strlen(str2)-strlen(str1)>0)
 {
 printf("str2>str1\n");
 } 
 else
 {
 printf("srt1>str2\n");
 }
 return 0; }

请问上述代码输出的是什么呢?我们通过观察发现str2的长度比str1短所以strlen(str2) - strlen(str1)应该是小于0的,所以应该输出str1 > str2,是不是真的是这样呢?
在这里插入图片描述
我们发现与我们所想的结果并不相同,这是为什么呢?strlen(str2) - strlen(str1)应该是小于0的没错,但是不要忘记了strlen的返回值是一个无符号的整形,那么一个小于0的数他变成无符号整形后就是一个正整数,所以>0,输出str2 > str1。我们通过这样一个例题来加深大家对strlen返回值size_t的理解。

模拟实现

好了我们可以模拟实现一下这个库函数,首先对函数声明进行观察,观察他的参数与返回值类型之后,我们进行模拟实现

size_t my_strlen(const char* str)
{
	assert(str);
	char* start = str;
	char* end = str;
	while (*end != '\0')
	{
		end++;
	}
	return end - start;
}

int main()
{
	char* ch = "abcdefg";
	int len = my_strlen(ch);
	printf("%d", len);
	return 0;
}

我们设置一个起点就是字符串的首元素地址,在通过遍历获得一个终点,就是字符串\0所在的地址,我们拿终点地址减去起点地址就是他们中间字符的个数,也就是字符串的长度。当然还有其他方法,大家可以自己尝试去实现一下。

strcmp

使用方法与注意事项

在这里插入图片描述
通过对strcmp的描述我们了解到了,库函数strcmp的作用是比较两个字符串的大小,他们的返回值类型是int型,参数为两个字符指针。

标准规定
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字

strcmp库函数比较两个字符串时,是将他们的值进行比较ascii值进行比较

模拟实现

了解了上面的内容,我们可以试着模拟实现一下库函数strcmp

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1);
	assert(str2);

	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

int main()
{
	char arr1[] = "abcd";
	char arr2[] = "abad";

	int ret = my_strcmp(arr1,arr2);

	if (ret > 0)
	{
		printf(">");
	}
	else if (ret < 0)
	{
		printf("<");
	}
	else
	{
		printf("=");
	}
}

在这里插入图片描述

strcpy

使用方法与注意事项

在这里插入图片描述
通过对库函数strcpy的介绍我们知道了,strcpy的作用是将源字符串拷贝到目标字符串,返回值类型是char*参数是两个char*

关于strcpy我们需要注意的是
源字符串必须以\0结束。
会将源字符串的\0拷贝到目标空间
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变。

模拟实现

下面我们还是来模拟实现一下strcpy

char* my_strcpy(char* destination, const char* source)
{
	assert(destination);
	assert(source);
	char* str = destination;
	while (*destination++ = *source++)
	{
		;
	}

	return str;
}

int main()
{
	char arr[20] = "abc";
	char ch[] = "hello world";
	my_strcpy(arr, ch);
	printf("%s\n", arr);
	return 0;
}

在这里插入图片描述

strcat

使用方法与注意事项

在这里插入图片描述
库函数strcat的作用是将源字符串拼接在目标字符串之后,参数为两个char *,返回值类型为`char*。

注意事项
源字符串必须以\0结束
目标空间必须有足够大的空间,能容纳下源字符串的内容
目标空间必须可修改

字符串是不可以自己给自己追加的

模拟实现

char* my_strcat(char* destination, const char* source)
{
	assert(destination);
	assert(source);
	char* ret = destination;
	while (*destination != '\0')
	{
		destination++;
	}

	while (*destination++ = *source++)
	{
		;
	}
	return ret;
}

int main()
{
	char arr[20] = "hello ";
	char ch[] = "world";

	my_strcat(arr, ch);
	printf("%s", arr);
	return 0;
}

在这里插入图片描述

strstr

使用方法与注意事项

在这里插入图片描述
strstr库函数的作用是,判断源字符串是否是目标字符串的子串,如果是返回第一次查找到子串的地址,如果没有找到返回NULL。参数是两个字符指针,返回值类型是字符指针。

模拟实现

char* my_strstr(char* str1, const char* str2)
{
	assert(str1);
	assert(str2);

	const char* s1 = str1;
	const char* s2 = str2;
	const char* p = str1;

	if (*s2 == '\0')
	{
		return NULL;
	}

	while (*p)
	{
		s2 = str2;
		s1 = p;
		while ((* s1 == *s2) && s1 != '\0' && s2 != '\0')
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return (char*)p;
		}
		p++;
	}
	return NULL;

}

int main()
{
	char arr[20] = "abcdedefg";
	char ch[] = "def";

	char* ret = my_strstr(arr, ch);

	if (ret == NULL)
	{
		printf("不存在字串");
	}
	else
	{
		printf("%s", ret);
	}

	return 0;
}

在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悲伤猪小猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值