前言
这篇文章将要带我们去实现模拟一个stelen()
函数
首先我们要知道strlen()
函数的定义
strlen()定义和用法
我们先看一下strlen
在cplusplus网站中的定义
链接: 点击跳转
这里我们可以知道strlen
的用法
size_t strlen ( const char * str );
获取字符串长度
返回 C 字符串 str
的长度。
C 字符串的长度由终止 null
字符决定:C 字符串的长度与字符串开头和终止 null 字符之间的字符数(不包括终止 null
字符本身)一样长。
这不应与保存字符串的数组的大小相混淆。例如:
char mystr[100]=“test string”;
定义一个大小为 100 个字符的字符数组,但初始化 mystr 的 C 字符串的长度只有 11 个字符。因此,当 sizeof(mystr)的计算结果为 100 时,strlen(mystr) 返回 11。
- 字符串以
'\0'
作为结束标志,strlen
函数返回的是在字符串中'\0'
前⾯出现的字符个数(不包含'\0'
)。 - 参数指向的字符串必须要以
'\0'
结束。 - 注意函数的返回值为
size_t
,是⽆符号的
(详细的size_t
类型介绍可以看这篇文章【C语言】C\C++中的size_t类型)
这里补充一点
’\0‘
的ASCLL
码值为0
strlen()的模拟实现
知道了函数的定义和用法和上述的知识,就可以模拟实现了!
方法一:
首先我想到了第一种实现方法:
用计数器的方式实现
- 把字符串
str
传入我们的模拟函数my_strlen()
中 - 定义一个计数器变量
count
用来记录只服从长度 - 循环遍历
str
(每一次count++
并且str++
)直到遇到‘\0'
- 最后返回
count
代码
//计数器⽅式
int my_strlen(const char * str)//这里我们不会更改str所以加上const修饰
{
int count = 0;
assert(str);//断言 str不为空指针
while(*str)
{
count++;
str++;
}
return count;
}
方法二:
那不使用计数器还有其他方法可以实现吗?
第二种方法我想到了递归
用递归的方法实现
- 我们每次传入
my_strlen()
函数str+1
- 判断
*str
是否为’\0‘
是’\0‘
返回0否则返回1+my_strlen(str+1)
代码
//不能创建临时变量计数器
int my_strlen(const char * str)
{
assert(str);
if(*str == '\0')
return 0;
else
return 1+my_strlen(str+1);
}
方法三:
那除了这两种方法还有没有别的方法呢!!
有!!
用一个指针减去另一个指针
指针-指针 方法
- 在
my_strlen()
函数中定义一个指针p
- 给
p
指针赋值为str
- 循环遍历
*p
(每次p++
) - 这时循环结束
p
指针会指向字符串的最后位置(’\0'
) - 用
p
指针减去str
就是用p
的地址减去str
的地址最后得到字符串长度
代码
//指针-指针的⽅式
int my_strlen(char *str)
{
assert(str);
char *p = str;
while(*p != ‘\0’ )
p++;
return p-str;
}
如此,我们就用了三种方法去模拟实现了库函数中的strlen函数
如果有什么不足的地方,欢迎大家指正!
※ 如果文章对你有帮助的话,可以点赞收藏!!谢谢支持