前言
strlen()是C语言重要的库函数之一,主要功能是求字符串长度。strlen函数统计的是从参数提供的地址开始,'\0'之前字符串中的字符个数(包括空白字符)。
strlen的模拟实现
通过strlen的工作原理可以知道,想要模拟实现strlen函数就要有一个地址(起点)和'\0'(终点),如果没有起点函数无从下手,如果没有终点,函数可能越界访问,故而二者缺一不可。
方法一数组传参
数组传参传递的是数组首元素的地址,因此在被调函数中与主调函数使用的是同一个数组,也是同一块空间。通过数组传参的方式能轻松访问到该数组的内容。
int my_strlen(char arr[])
{
int i = 0;
int count = 0;//记录字符个数
while (arr[i] != '\0')//利用数组方式遍历元素,终点为'\0'
{
i++;
count++;
}
return count;
}
方法二 指针相减
当两个指针指向同一块空间时,两指针之差的绝对值即为二者间的元素个数。这句话相当重要,务必牢记,前提条件是两个指针指向同一块空间(即同一个数组)。利用该条件,可以通过首元素与'\0'的地址差值得到二者之间元素个数
int my_strlen(char* pa)
{
char* p = pa;
while (*p != '\0')//通过循环得到'\0'的地址
p++;
return p - pa;
}
方法三函数递归
char arr[] = { "abcdef " };
如上,如果要得到arr数组的字符个数,我们可以将数组拆为'a' + "bcdef",其中a的地址为arr,b的地址为arr + 1...以此类推,将arr数组拆到'\0'为止。也就是说可以把函数写为递归的形式,参数为首元素地址,结束标志为'\0',代码如下
int my_strlen(char* p)
{
if (*p == '\0')
return 0;
else
return 1 + my_strlen(p + 1);
}