一,概要
在求字符串长度的时候我们会遇到求解字符串的长度,此时我们想到的是strlen,头文件是string.h,在本次学习中,小编将会带领大家完成字符串函数的功能实现代码是怎么样的,首先strlen求解的是字符串长度,字符串在遇到\0的时候会停止求解,所以我们只需要判断\0之前有多少个字符就可以,而我们需要了解的是strlen的功能实现函数,接下来由我们自己对strlen函数功能实现
在这里我们打开c官网查看strlen的函数。
在这里我们可以看到函数是声明长什么样子,注意到以下几点:
- strlen返回值的变量类型是size_t,size_t代表无符号整型。这是因为strlen是求解字符串长度的,长度不可能是负数,所以我们只能返回正整数。
- 传进来的字符串数组,我们用字符串指针进行接收,也可以用字符串数组接收
- 传进来的字符串数组,我们得到数组首元素的地址,通过首元素地址,我们可以访问后面的元素得到整个字符串,但是在求字符串的时候我们肯定不能去通过传进来的指针修改字符串的内容,于是我们在*的左边加一个const修饰,const放在*的左边修饰的是指针指向的内容,表示指针指向的内容不能进行修改。
二,题目
模拟实现函数strlen,在题目中代码不能使用string.h中的strlen求解字符串的长度,也就是补齐下面代码,也就是补齐my_strlen的功能实现
int main()
{
char arr[] = "abcdef";
int num = my_strlen(arr);
printf("%d ",num);
return 0;
}
三,方法
1,方法一
利用普通循环来实现,设一个加数器count,然后进来因为传进来的是数组首元素的地址,所以先要对它进行解引用判断是否为 \0 不是加数器加1,因为传过来的是数组地址,然后地址加一就指向下一个地址,然后再去判断这不就构成了一个循环,代码如下
size_t my_strlen(const char arr[])
{
int count = 0;
while (*arr != '\0')
{
count++;
arr++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
int num = my_strlen(arr);
printf("%d ",num);
return 0;
}
2,方法二
递归实现方法,在这里我们需要思考一下,我们在内存中存储如下,首先我们传参传过来的实参是数组名,在数组中首元素的地址就是,所以我们这里接收就是数组首元素的地址,然后进来首先他是指向首元素的地址也就是第一个元素的地址,我们先要对他进行判断,如果不是\0就是加一,如果不是就返回0如下图;
于是我们就可以如下图一样,进行递归,当最后到\0的时候返回0递归结束
size_t my_strlen(const char* arr)
{
if (*arr != '\0')
{
return 1 + my_strlen(arr+1);
}
else
{
return 0;
}
}
int main()
{
char arr[] = "abcdef";
int num = my_strlen(arr);
printf("%d ",num);
return 0;
}
3,方法三
指针减去指针的方法实现,因为指针定义里指针减去指针就是指指针与指针之间元素的个数,因为我们传参传递进来的是首元素的地址,所以我们把首元素的地址存入一个指针变量start中,然后我们对地址进行解引用找到地址所指向的元素进行判断如果这个元素不等于\0则进入循环中,然后地址进行向后移动,直到遇到\0就停止,此时指向的元素的地址就是\0之前的地址,用最后一个地址减去首元素地址就可以得到中间元素的个数,也就是字符串中字符的个数
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char arr[])
{
char* start = arr;
assert(arr != '\0');// 判断传进来的指针不是空指针
while (*arr != '\0')
{
arr++;
}
return arr - start;
}
int main()
{
char arr[] = "abcdef";
int num = my_strlen(arr);
printf("%d ",num);
return 0;
}
四,总结
通过本次学习我们掌握所学完成自定义求字符串的函数功能实现,如有对strlen函数的一些内容或者在实际中是如何求解的请看小编所写的详解sizeof和strlarren。学习就是不断探索的过程,在这里我们掌握了库函数中strlen函数是如何实现求字符串函数的长度的,对于一些其他库函数,大家如果有兴趣的话,也可以自己去实现一下噢。