模拟实现库函数strlen - C语言
strlen函数介绍
在实现库函数strlen之前,我们首先要了解一下strlen函数。
功能
函数功能:计算字符串长度,即'\0'前的字符数。
返回类型及函数参数
返回类型:size_t 实际上就是unsigned int。
函数参数:const char *string。const修饰的字符型指针变量,保证string指向的内容不可改变,提高了代码的安全性。
头文件
头文件:<string.h>
模拟实现strlen - my_strlen
在对strlen函数有一定了解之后,我们就要尝试实现我们自己的strlen函数,即my_strlen。
创建函数环境
首先我们要创建一个函数环境。
函数环境:
#include <stdio.h>
#include <assert.h>//assert需要引用的头文件
#define N 10000//定义符号常量
size_t my_strlen(const char*);//my_strlen函数声明
int main()//函数环境
{
char ch[N] = { 0 };
gets(ch);//读取字符串
unsigned len = my_strlen(ch);//函数调用
printf("%u\n", len);//打印字符串长度
return 0;
}
在创建好函数环境之后,就是my_strlen 函数的具体实现。
计数器版本
要点:当指针变量str指向的字符不是'\0'时,str自增指向下一个字符,同时count自增。
size_t my_strlen(const char* str)//版本2 - 计数器版本
{
assert(str != NULL);//断言 - 避免str为空指针
unsigned count = 0;//计数器初始化
for (count = 0; *str++ != '\0'; count++);
return count;
}
指针-指针版本
要点:指针-指针所得结果为两个指针之间的元素个数,首先用str1记录字符串首地址,然后用str自增找到'\0'的位置,最后用str-str1即为两个指针间元素的个数。
size_t my_strlen(const char* str)//版本1 - 指针-指针版本
{
assert(str != NULL);//断言
const char* str1 = str;//记录字符串首地址
while (*str != '\0')
{
str++;
}
return str - str1;
}
递归版本
递归版本就比较简单了,采用了大事化小原理,这里不做过多介绍。
size_t my_strlen(const char* str)//版本3 - 递归版本
{
assert(str != NULL);//断言
if (*str != '\0')
{
return (1 + my_strlen(str + 1));//递归调用
}
return 0;
}
运行结果
模拟实现库函数strlen的三种方法,你学会了吗!