C语言三种方法实现strlen函数(源码和讲解)

本文详细介绍了如何在C语言中模拟strlen函数,包括计数器方法、指针-指针、递归和在函数内部计算的方法,以及每个方法的工作原理和示例代码。
摘要由CSDN通过智能技术生成

 C语言函数库中的strlen函数表明,传入一个char类型的指针,返回一个size_t类型(unsigned int)的返回值,并且此函数只能用于字符串不能用于数组,下面我们就用三种方法来模拟实现一下strlen函数。

1.计数器方法

事先解释一下assert函数是为了防止变量str为空,用此函数需声明assert.h文件。

模拟C语言函数库来定义一个my_strlencou函数(名字随便起),并在函数内定义一个无符号类型的变量count,再次利用while循环来找字符串中的‘\0'字符(此字符是创建字符串时自动添加的),如果不是\0'字符,count就加1,如果找到\0'字符就跳出循环并返回count。while (*str++) count++;这句换就是while(*str){count++; str++}

//计数器方法
size_t my_strlencou(const char* str)
{
	assert(str);
	size_t count = 0;
	while (*str++) count++;
	return count;
}

 2.指针-指针

以为字符串时char*类型的,char在内存中占一个字符,在定义字符串时char[],也可以理解为定义一个char类型的数组,并在数组最后方多放一个’\0'字符,这样我们就可以用循环来找到‘\0'在内存中的位置,因为在找寻'\0'字符时地址值会发生变化,所以我们就要多定义一个字符地址sopystr来拷贝原str地址,再用新创建的copystr经行差找'\0',最后再用’\0'的地址减去原str的地址再减一(这里减一是减去‘\0'的地址,返回时不算'\0')就可以了。

//指针-指针
size_t my_strlenpoin(const char* str)
{
	assert(str);
	char* copystr = str;
	while (*copystr++);
	return copystr - str - 1;
 }

3.递归的方法

我们先拿到一个字符地址,之后就返回数字1和本函数的调用 ,盗用的函数实参就是str加一,(str加一就是字符串中下一个字符的地址值),再给函数写一个停止调用的功能,我们让此函数在str地址值指向’\0'时我们就停止调用本函数,并返回一个数字0(因为'\0'不算长度),这样我们的函数就完成了。

//递归的方式
size_t my_strlenrecu(const char* str)
{
	if (*str == '\0')
		return 0;
	else
		return my_strlenrecu(++str) + 1;
}

 4.创建函数内计算的方法

此方法算是拓展,因为此方法只能在定义字符串变量的方法内使用,如果定义的字符串被传值到其他的方法内,再使用此方法就不行了。

方法就是简单的计算用C语言中自带的sizeof函数先算出字符串的总大小,再用sizeof算出字串中任意一个字符的大小,再相除减一(减一减的是‘\0’字符所占总字符的大小,取字符串内任意字符:我们可以把字符串看成一个字符数组,就是再数组组后放加一个‘\0’,所以用字符数组中arr[0],在字符串中也能用。

int main()
{
	char arr[] = "adffgg" ;
	int len = sizeof(arr) / sizeof(arr[0]) - 1;
	printf("%d", len);
}

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值