一、strlen函数:
用来求字符串的长度的函数,且计算的是 ‘\0’ 之前的字符的个数;
如下是strlen函数的申明,size_t 表明函数返回类型为无符号整型,const char* a表示字符指针,接受字符串数组,const锁住了指针,防止*a指向的内容不小心发生改变
size_t strlen(const char *a)
二、计数器实现:
先申明下:我每个程序用到了assert()函数,这个函数叫断言,会对括号里面的表达式进行检查,出现错误会报错,指明错误在哪;对指针用,可以防止传参时传出的空指针或者野指针,使程序更严谨,需要注意的是包含头文件:
#include<assert.h>;
所谓的计数器,就是设置一个变量 cunt 每确认一个字符,不为\0,则进行加一的操作;
//由计数器完成
#include<assert.h>
size_t my_strlen(const char* s1)
{
assert(s1);//断言;
size_t cunt = 0;
while (*s1++)
cunt++;
return cunt;
}
三、指针-指针实现:
因为指针减去指针可以求出两个指针间元素个数,因此我们可以首元素地址减去\0处的地址
while循环中,*s1指向的内容为\0时会结束循环,此时的s1就是\0处的地址;
size_t my_strlen(const char* s1)
{
assert(s1);
char* p = s1;//存放首元素地址到指针p中
//通过while循环来找到\0的地址;
while (*s1)
s1++;//此时s1就是\0的地址
return s1 - p;//返回两个指针间元素个数;
}
int main()
{
char arr[] = "abcdef";
printf("%d\n", my_strlen(arr));
return 0;
}
四、通过递归实现(一般会换种说法:在不创建临时变量的情况下,计算出数组长度):
1、思考并进行编写:
这个时候想到了递归,大事化小的思想;可以从限制条件即结束条件考虑;当*s1指向的内容为\0时,最后一次应该是返回零,因此可以先写出限制条件;我们考虑每次元素不为\0,那么就要加1,递归开始时每次向函数传参,应该是在本函数时,下一个元素的地址,因此就有了s1++;
size_t my_strlen(const char* s1)
{
assert(s1);
//递归结束的条件
if (*s1 == '\0')
return 0;
//地址加一,得到下一个元素的地址
s1++;
return 1 + my_strlen(s1);
}
int main()
{
char arr[] = "abcdef";
printf("%d\n", my_strlen(arr));
return 0;
}
2、易错提醒:
若是将s1++直接放入函数递归中会怎样呢?
size_t my_strlen(const char* s1)
{
assert(s1);
//递归结束的条件
if (*s1 == '\0')
return 0;
return 1 + my_strlen(s1++);
}
此时递归就坏了,因为函数调用时,先传参的s1.并不是s1++的值,那就会限制在一直传s1的递归中,已经不符合递归条件了;

当然了,若是放置前置加加,就可以放入函数调用中了
return 1 + my_strlen(++s1);//前置++,先加一个地址,再传地址

1744

被折叠的 条评论
为什么被折叠?



