【C语言字符串函数】strlen的三种模拟实现(附详细逻辑)

一、方法一(计数器)

(一)代码思路

通过遍历字符串中的字符,并计数,直到遇到字符串的结束符为止,从而得到字符串的长度。

(二)代码实现
size_t my_syrlen(const char* str)
{
	size_t  count = 0;
	assert(str != NULL);
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}
(三)详细逻辑
  1. 声明并初始化一个变量 count,用于记录字符串的长度,初始值为0。
  2. 使用断言 assert(str != NULL) 来确保传入的字符串指针不为空,以防止出现空指针异常。
  3. 进入循环,条件为 *str,即只要当前字符不是字符串的结束符('\0'),就执行循环体内的操作。
  4. 在循环体内,每次循环都将 count 自增1,表示已经遍历过一个字符。
  5. 将指针 str 向后移动一个位置,以便处理下一个字符。
  6. 循环结束后,返回计数器 count 的值,即得到了字符串的长度

二、方法二(指针相减)

(一)代码思路

通过将指针从字符串的起始位置移动到结束位置,然后计算两个指针之间的偏移量,从而得到字符串的长度。这种方法利用了指针的算术运算,避免了使用计数器,从而减少了代码的复杂性。

(二)代码实现
size_t my_syrlen(const char* str)
{
	const char* start = str;
	assert(str != NULL);
	while (*str)
	{
		str++;
	}
	return str - start;
}
(三)详细逻辑
  1. 声明并初始化一个指针变量 start,将其指向传入的字符串 str 的起始位置。
  2. 使用断言 assert(str != NULL) 来确保传入的字符串指针不为空,以防止出现空指针异常。
  3. 进入循环,条件为 *str,即只要当前字符不是字符串的结束符('\0'),就执行循环体内的操作。
  4. 在循环体内,将指针 str 向后移动一个位置,以便处理下一个字符。/循环结束后,返回指针 str 与起始指针 start 之间的偏移量,即可得到字符串的长度。


​​​​​​三、方法三(递归)

(一)代码思路

如果当前字符是结束符,则返回0;否则,递归调用函数本身,并将指针向后移动一个位置,然后将返回结果加上1。递归调用会一直进行,直到遇到结束符,然后从最深层的递归返回,并依次累加长度,最终得到字符串的长度。

(二)代码实现
size_t my_syrlen(const char* str)
{
	if (*str == '\0')
		return 0;
	else
		return 1 + my_syrlen(str + 1);
}

(三)详细逻辑
  1. 首先检查当前字符是否为字符串的结束符('\0')。
  2. 如果是结束符,则返回0,表示字符串为空,长度为0。
  3. 如果不是结束符,执行递归调用。
  4. 递归调用的参数是字符串指针 str 加上1,即指向下一个字符的位置
  5. 递归调用返回的结果加上1,表示当前字符的长度。
  6. 最终返回的是所有字符长度的累加结果。
     
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值