【C语言】模拟实现strlen

strlen是非常常用的字符串函数

目录

  • 介绍:
  • 模拟实现:
    • 计数器
    • 递归
    • 指针-指针

介绍:

【C语言】模拟实现strlen_第1张图片

我们可得这个函数是求在字符串开始与'\0'之间的字符串长度

代码示例:

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

结果:
【C语言】模拟实现strlen_第2张图片
解释:

这里的6和3容易理解,那么str2>str1怎么解释?
因为strlen返回值类型为size_t类型,为无符号整形
即相减的结果虽然为一个负数,但负数的无符号整形显然是巨大的正数
故大于

此函数的注意事项:
1.字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
2.参数指向的字符串必须要以 ‘\0’ 结束。
3.注意函数的返回值为size_t,是无符号的( 易错 )

模拟实现:

实现strlen有多种方法

计数器

思路:

通过设计计数器count进行计数,只要当前字符不为0就+1

代码实现:

int my_strlen(const char* str)
{
	assert(str);
	int count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}

int main()
{
	char str[] = "abcdef";
	int ret =my_strlen(str);
	printf("%d ", ret);
	return 0;
}

递归

思路:
记住递归的两个要素
1.有一个临界值
2.越来越接近临界值

假设有一个字符串abc
那么我们每进行一次递归
字符串就少一个元素,当遇到0时停止递归

abc//进入函数时的字符串
1+bc//第一次递归
  1+c//..
    1//最后一次

代码实现:

int my_strlen(const char* str)
{
	if (*str != 0)
		return 1 + my_strlen(str + 1);
	else
		return 0;
}

int main()
{
	char str[] = "abcdef";
	int ret =my_strlen(str);
	printf("%d ", ret);
	return 0;
}

指针-指针

首先要知道指针-指针得到的是中间的元素个数,并非别的元素
思路:

记录开始的地址
利用循环得到\0的地址
两者相减

代码实现:

int my_strlen(const char* str)
{
	char* start = str;
	while (*str)
	{
		str++;
	}
	return str - start;
}

int main()
{
	char str[] = "abcdef";
	int ret = my_strlen(str);
	printf("%d ", ret);
	return 0;
}

欢迎纠错与讨论

你可能感兴趣的:(c语言,开发语言)