strlen是string length(字符串长度)的缩写,函数原型为 int strlen(const char *str); 函数返回字符串的长度(不包括 '\0'),根据函数的功能我们可以来试着模拟实现一下这个函数。
模拟实现strlen函数有很多种方法,我们就来用三种常见的方法实现一下。
1、利用计数器的实现方法
实现思路是我们定义一个计数器,一个一个字符的数,当遇到 '\0' 时就停止计算并返回。
int My_strlen(const char *str)
{
int count = 0; //建立计数器
assert(str != NULL);
while (*str++)
{
count++; //开始计数
}
return count;
}
我们来看一下代码的测试,在VS编译器32位平台下输入如下代码:
int main()
{
char arr[] = "abc";
int len = My_strlen(arr);
printf("len = %d\n", len);
return 0;
}
程序运行结果如下:
理想中的结果!
2、不建立计数器的实现方法
不建立计数器,这就要求我们充分利用字符串的特征来实现,我们看如下实现:
int My_strlen(const char *str)
{
char *start = (char*)str;
assert(str != NULL);
while (*str) //让str指针挪到指向字符串'\0'位置处
{
(char*)str++;
}
return str - start; //用指向字符串尾部的指针减去指向字符串首部的指针,得到字符串长度
}
这就是没有建立计数器的实现方法了,我们看一下测试结果:
理想中的结果!
3、递归实现
strlen函数的递归实现也没有建立计数器,递归实现有个优点就是很容易就能想到,非常简单易懂,不过缺点是效率较差,当字符串很长时其效率远远低于上面的两种方法。我们看一下递归实现:
int My_strlen(const char *str)
{
assert(str != NULL);
if (*str == '\0') //检查是否已经到达字符串尾部
return 0;
return 1 + My_strlen(str + 1);
}
模拟如上,看我们的测试:
理想中的结果!
strlen函数的模拟很简单,但要做到兼顾效率及可读性还是需要花一点功夫的,我们可以在系统中看一下大师写的源代码,领略一下大师风范。