目录
一、计算器法
一串字符的结束标志是‘\0’,因此我们从字符串首元素不断向后累加查看是否到达碰到‘\0’若遇到则停止,我们运用while循环将条件设置为指向字符串元素的指针,且‘\0’的ASCII码值为0,所以指针指向‘\0’时循环停止,期间在判断是否为‘\0’时拿一个变量计数,当while循环停下来时计数也停止。代码如下:
int my_strlen1(const char* pa)
{
//计算器法
assert(*pa);
int n = 0;
while (*pa++)
{
n++;
}
return n;
}
int main()
{
char all[] = "abcdef";
printf("%d\n", my_strlen1(all));
return 0;
}
二、 递归法
我们仍然使用终止条件为‘\0’,在每次退出递归时我们就返回+1,这样就可以知道程序进行了多少次递归,当然在遇到‘\0’时返回0。
如图:
代码如下:
int my_strlen2(const char* pa)
{
//递归法
if (*pa)
return 1 + my_strlen2(pa + 1);
else
return 0;
}
int main()
{
char all[] = "abcdef";
printf("%d\n", my_strlen2(all));
return 0;
}
注意:递归法虽然简化了代码量,但是有时候会导致一个本可以简便计算的公式变得使用更大的内存计算,例如:斐波那契数列的计算,若用递归法,计算到后面会导致计算过多而出现堆栈溢出。所以不是所有方法都适合递归,使用需谨慎。
三、 指针相减法
运用指针减指针可以得到中间元素个数的性质可以求出字符串长度,我们保存起始指针的地址,然后不断让指针向后移动至‘\0’处停下来,在让该末尾指针减去起始指针即可以得出字符串中的元素个数。
代码如下:
int my_strlen3(const char* pa)
{
//指针相减
char* p = pa;
while (*pa)
{
pa++;
}
return pa - p;
}
int main()
{
char all[] = "abcdef";
printf("%d\n", my_strlen3(all));
return 0;
}