strlen是非常常用的字符串函数
目录
- 介绍:
- 模拟实现:
- 计数器
- 递归
- 指针-指针
介绍:
我们可得这个函数是求在字符串开始与
'\0'
之间的字符串长度
代码示例:
#include <stdio.h>
int main()
{
const char* str1 = "abcdef";
const char* str2 = "bbb";
printf("%d\n", strlen(str1));
printf("%d\n", strlen(str2));
if (strlen(str2) - strlen(str1) > 0)
{
printf("str2>str1\n");
}
else
{
printf("srt1>str2\n");
}
return 0;
}
结果:
解释:
这里的6和3容易理解,那么str2>str1怎么解释?
因为strlen返回值类型为size_t
类型,为无符号整形,
即相减的结果虽然为一个负数,但负数的无符号整形显然是巨大的正数
故大于
-
此函数的注意事项:
- 1.字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
- 2.参数指向的字符串必须要以 ‘\0’ 结束。
- 3.注意函数的返回值为size_t,是无符号的( 易错 )
模拟实现:
实现strlen有多种方法
计数器
思路:
通过设计计数器
count
进行计数,只要当前字符不为0就+1
代码实现:
int my_strlen(const char* str)
{
assert(str);
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
int main()
{
char str[] = "abcdef";
int ret =my_strlen(str);
printf("%d ", ret);
return 0;
}
递归
思路:
记住递归的两个要素
1.有一个临界值
2.越来越接近临界值
假设有一个字符串abc
那么我们每进行一次递归
字符串就少一个元素,当遇到0时停止递归
abc//进入函数时的字符串
1+bc//第一次递归
1+c//..
1//最后一次
代码实现:
int my_strlen(const char* str)
{
if (*str != 0)
return 1 + my_strlen(str + 1);
else
return 0;
}
int main()
{
char str[] = "abcdef";
int ret =my_strlen(str);
printf("%d ", ret);
return 0;
}
指针-指针
首先要知道指针-指针得到的是中间的元素个数,并非别的元素
思路:
记录开始的地址
利用循环得到\0
的地址
两者相减
代码实现:
int my_strlen(const char* str)
{
char* start = str;
while (*str)
{
str++;
}
return str - start;
}
int main()
{
char str[] = "abcdef";
int ret = my_strlen(str);
printf("%d ", ret);
return 0;
}
欢迎纠错与讨论