模拟实现常见的strlen、strcpy、strcmp库函数,深入理解它们的原理

在这里插入图片描述

  • ⛩️博主主页:@威化小餅干
  • 系列专栏:【C语言】藏宝图
  • 绳锯⽊断,⽔滴⽯穿!一个编程爱好者的学习记录!

文章目录

  • 模拟实现strlen
    • 高仿版my_strlen函数
  • 模拟实现strcpy
    • 高仿版my_strcpy
  • 模拟实现strcmp
    • 高仿版my_strcmp
  • 完结

模拟实现strlen

在模拟strlen函数之前,我们需要先去知道strlen库函数有什么作用。

首先要知道它长什么样,如下:

形式:strlen(字符串)

作用:

  • 测量字符串长度。函数值为“字符串”的实际长度,strlen函数返回的是在字符串中\0前面出现的字符个数(不包含‘、0’)
  • 参数指向的字符串必须要以\0结束
  • 注意函数的返回值为size_t,是无符号的

模拟实现常见的strlen、strcpy、strcmp库函数,深入理解它们的原理_第1张图片


strlen函数是C语言提供的库函数,平常写代码时我们要想知道一个字符串的长度,则可以直接使用strlen函数得到,但要注意在使用字符串函数时,要包含头文件#include

但是为了 体现我的能力,去别人面前装逼 深入理解strlen函数的工作原理,我们可以去高仿一个strlen函数,按我们自己的想法去实现字符串的计数功能,这怎能没有满满的成就感鸭!

废话少说,直接开干!

高仿版my_strlen函数

可以分三种方法去实现,分别是用计数器、递归、指针-指针去实现(如果还有更好的方法欢迎大家一起讨论学习!)

第一种方法:计算器方式

//1、计算器方式
#include
#include

int my_strlen(const char* str)//因为指针求字符串长度不能改变原字符串,所以加const修饰,使得程序运行更安全(没加const也不影响程序运行)
{
	assert(str != NULL);//断言,判断指针是否为空(NULL)
	int count = 0;//计数器
	while (*str != '\0')//解引用看是否为'\0';不是'\0'就进入while循环
	{
		count++;//计数器计数
		str++;指针往下走
	}
	return count;//字符串的长度
}

int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d\n", len);
	
	return 0;
}
  • 原理分析:
    我们定义了一个存放字符串的arr数组,然后调用my_strlen函数去实现strlen函数的计数功能。
    把arr数组的地址传给my_strlen函数,因为strlen函数返回的是在字符串中\0前面出现的字符个数,即遇到\0就停止。我们设计一个while循环,*str(str是数组首元素地址),则对str解引用就是数组第一个元素,若不是\0,就然计算器count++,然后str的地址也++到下一个,再进行判断。count的大小就是目标字符串的长度了。

第二种方法:不用创建临时变量计数器(递归)

#include
#include

int my_strlen(const char* str)//不能改变字符串,加const修饰
{
	assert(str != NULL);//断言,判断指针是否为空(NULL)
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);//不是'\0',就进来继续调用my_strlen函数,调用的同时指针往后走,直达遇到'\0'
}

int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d\n", len);

	return 0;
}
  • 原理分析:
  • 不用创建临时变量count计数,就需要用到函数的递归操作

第三种方法:指针-指针

#include
#include

int my_strlen(char* str)//不能改变字符串,加const修饰
{
	assert(str != NULL);//断言,判断指针是否为空(NULL)
	char* start = str;//先把字符串指针的起始位置记录下来,赋给指针start
	char* end = str;//还有一个指针要往后走找'\0',所以再定义一个指针end,也是从起始位置开始
	while (*end != '\0')//不是'\0',就进入循环
	{
		end++;//不是'\0',指针end就往后走
	}
	return (end - start);//遇到'\0'后,就用 末尾位置 - 起始位置 = 字符串个数
	
}

int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d\n", len);

	return 0;
}
  • 原理分析:
  • 末尾位置 - 起始位置 = 字符串个数

模拟实现strcpy

strcpy函数是负责将源字符串中的元素分毫不差的拷贝到目标字符串中的一个函数

形式:strcpy(字符数组1,字符串2)

作用:将字符串2复制到字符数组1中。

字符数组1必须定义得足够大,以便能容纳被复制的字符串,且字符数组1必须是数组名形式或字符型指针变量。

模拟实现常见的strlen、strcpy、strcmp库函数,深入理解它们的原理_第2张图片


高仿版my_strcpy

#include
#include
char* my_strcpy(char* dest, const char* src)
{
	char* temp = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest = *src)
	{
		dest++;
		src++;
	}
	return temp;
}

int main()
{
	char str1[20] = { "Hello world!" };
	char str2[] = { "我爱编程!" };
	char* ret = my_strcpy(str1, str2);
	printf("%s\n", ret);
	return 0;
}

模拟实现常见的strlen、strcpy、strcmp库函数,深入理解它们的原理_第3张图片

抓住核心:当源字符串中的\0被拷贝至目标字符串中时,即停止拷贝!


模拟实现strcmp

形式:strcmp(字符串1,字符串2)

作用:字符串比较的函数

因为字符串不能用等号来比较大小,所以就用strcmp函数来比较。
如果字符串1等于字符串2,函数返回值为0;如果字符串1大于字符串2,返回值为一正数;如果字符串1小于字符串2,返回值为一负数

模拟实现常见的strlen、strcpy、strcmp库函数,深入理解它们的原理_第4张图片

高仿版my_strcmp

#include
#include

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	assert(str && arr);//断言
	while (*str1 == *str2)//比较两个字符,不相等就跳出循环
	{
		if(*str1 == '\0')//就入while循环,说明*str1 == *str2,然后当*str1=='\0'时,*str2也为'\0',即相等,返回0
			return 0;
		str1++;
		str2++;
	}
	if (*str1 > *str2)
		ret = 1;
	else
		ret = -1;
	return ret;

}

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abq";
	int ret = my_strcmp(arr1,arr2);
	printf("%d\n",ret);

完结

✨✨请各位小伙伴多多点赞关注收藏支持鸭!✨✨

你可能感兴趣的:(【C语言】藏宝图,c语言)