实现strlen的三种方法

目录

一、strlen函数介绍

二、实现strlen的三种方法

1、第一种方法(计数)

2.第二种方法(递归)

3.第三种方法(指针-指针)

三、总结


一、strlen函数介绍

  当我们在求一个字符串的长度时,经常会使用到strlen()这个函数,那么它具体是怎样实现的呢?首先让我们先了解一下这个函数。

size_t  strlen  (  const  char  *  str  );

1.字符串以 '\0' 作为结束标志,strlen函数返回的值就是在字符串中'\0'的前面出现的个数(不包含'\0')

2.参数指向的字符串必须要以 '\0' 结束。

   假如有一个存放字符串的数组:

   char   arr[ ]="abcdef"   这个数组中存放的内容其实是 a,b,c,d,e,f,\0这7个字符,arr为数组名,也表示数组首元素地址,从首元素开始,直到遇到 ' /0 '结束,这样就能准确的计算出字符串的长度。如果数组初始化为以下这种形式:char  arr[ ]={'a', 'b' ,'c' ,'d' ,'e' ,'f' },那么使用strlen计算的字符串长度就是一个随机值,因为参数指向的字符串不包含' \0 '。

3.注意函数的返回值为size_t是无符号的,就是unsigned int

二、实现strlen的三种方法

1、第一种方法(计数)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str) //计算字符串长度,字符串的内容是不会被改变的,所以最好用const修饰一下,保证数据的安全性。
{                               
	assert(str != NULL);    //断言,指针不为空
	int count = 0;         //计数
	while (*str != '\0')
	{
		count++;   //当它的字符不等于'\0'时,计数加一
		str++;    //指向下一个字符
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	int ret=my_strlen(arr);
	printf("%d\n", ret);
	return 0;
}

2.第二种方法(递归)

#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)//计算字符串长度,字符串的内容是不会被改变的,所以最好用const修饰一下,保证数据的安全性。
{
	assert(str != NULL);//断言,指针不为空
	if (*str != '\0')
	{
		return 1 + my_strlen(str + 1);
	}
	else
	{
		return 0;
	}
}
int main()
{
		char arr[] = "abcdef";
		int ret = my_strlen(arr);
		printf("%d\n", ret);
		return 0;
}

3.第三种方法(指针-指针)

两个指针相减,得到的是两个指针之间元素的个数。我们先用一个指针放首字符地址,然后再找到最后一个字符的地址,用最后一个字符地址减去第一个字符地址,就是他们之间元素个数。

#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)//计算字符串长度,字符串的内容是不会被改变的,所以最好用const修饰一下,保证数据的安全性.
{
	assert(str != NULL);//断言,指针不为空
	const char* start = str;//定义一个指针放字符串首字符的地址,因为*str接收的字符串为常量字符串,所以这里最好也用const修饰一下
	while (*str != '\0')
	{
		str++;
	}
	return str - start;
}
int main()
{
		char arr[] = "abcdef";
		int ret = my_strlen(arr);
		printf("%d\n", ret);
		return 0;
}

三、总结

以上就是实现strlen的三种方法,知道了strlen具体是怎样实现的,就会让我们在使用strlen函数的过程中更加清晰和熟练,不容易出现错误。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值