模拟实现常见的strlen、strcpy、strcmp库函数,深入理解它们的原理
  joJp3k0vX7Vq 2023年11月02日 63 0




文章目录

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


🚀模拟实现strlen

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

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

形式:strlen(字符串)

作用:

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

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


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

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

废话少说,直接开干!

高仿版my_strlen函数

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

第一种方法:计算器方式

//1、计算器方式
#include<stdio.h>
#include<assert.h>

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<stdio.h>
#include<assert.h>

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<stdio.h>
#include<assert.h>

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库函数,深入理解它们的原理_bc_02


高仿版my_strcpy

#include<stdio.h>
#include<assert.h>
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库函数,深入理解它们的原理_#include_03

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


🚀模拟实现strcmp

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

作用:字符串比较的函数

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

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

高仿版my_strcmp

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

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);

完结

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


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  TKwJ4YzyA8uz   2024年05月17日   45   0   0 C语言
  6Df3JnWQUC5m   2024年04月24日   57   0   0 C语言
  fHBiUfJyY67V   2024年04月26日   42   0   0 C语言
  V88gxnVgnp1F   2024年05月08日   92   0   0 C语言
  6Df3JnWQUC5m   2024年05月08日   82   0   0 C语言
  o1ZcTI9mJsxK   2024年05月08日   121   0   0 C语言
  H5oyQecqjP4R   2024年04月26日   39   0   0 C语言
  6Df3JnWQUC5m   2024年04月25日   51   0   0 C语言
  nmX9dIiR6BtA   2024年04月28日   48   0   0 C语言
  6Df3JnWQUC5m   2024年05月17日   54   0   0 C语言
  6Df3JnWQUC5m   2024年04月25日   52   0   0 C语言