文章目录
- 前言
- strlen函数
- strlen函数的使用
- strlen函数的3种方法实现
- 方法1
- 方法2
- 方法3
- 总结
前言
各位老板好~ , 今天我们讲解strlen函数如何去使用以及如何去模拟实现strlen函数。希望各位老板能够给一个点赞和一个大大的关注,感谢各位老板!
strlen函数
strlen函数的使用
在库函数中,strlen函数的功能是求出字符串的长度,统计的是字符串中\0之前的字符个数。
函数原型如下:
size_t strlen ( const char * str );
使用strlen函数,需要包含头文件:
#include<string.h>
使用代码如下:
//strlen函数的使用
#include<string.h>
#include<stdio.h>
int main()
{char arr[] = "zhangsan"; size_t len = strlen(arr); printf("%zd\n", len); return 0;
}
运行结果:
分析:
- 值得注意的是strlen函数的返回值是size_t,也就是返回无符号整型,那么对应的占位符使用%zd。
- const char * str , 接收的是数组首元素的地址。
- 使用库函数,不要忘记包含对应的头文件。
strlen函数的3种方法实现
方法1
方法1,我们使用计数器方法,那么大概思路就是,我有一个指针变量p,它指向的是这个数组,指针变量p++,只要p指向的不是’\0’,那么我的计数器count++。
代码如下:
//strlen函数的模拟实现
//方法1(计数器)
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* p)
{int count = 0; //计数器assert(p != NULL); while (*p != '\0')//只要*p不等于'\0' , count就++{count++; p++; }return count;
}
int main()
{char arr[] = "zhangsan"; size_t len = my_strlen(arr); printf("%zd\n", len); return 0;
}
运行结果:
分析:
- 为了完成strlen函数的模拟,我们自己写了一个函数:my_strlen。首先,函数进行传参(数组传参传的是数组首元素的地址)。其次,创建变量len来接收值。最后打印该值。
- 进入函数里面,我们该如何去写? 既然传递的是地址,那么我们需要使用指针来接收,为了不想让值被修改,我们可以加上const的修饰指针。返回类型我们就按照strlen函数的一样就可以。
- 然后,既然是使用计数器方法,我们就创建一个计数器count。在其之前,我们可以使用assert函数断言一下,判断一下我们的指针是不是空指针,如果是会报出错误,使用assert,需要包含对应的头文件。
- 我们需要遍历数组元素,如果指针*p不是’\0’,那么计数器count++,最终,返回count就可以;如果是’\0’,直接结束。
方法2
方法二,我们使用指针-指针的方法。也就是让指针末-指针首就可以得到中间值,指针-指针必须是在同一内存空间。
代码如下:
//strlen函数的模拟实现
//方法2(指针-指针)
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* p)
{assert(p != NULL); const char* start = p; const char* end = p; while (*end != '\0'){end++; }return end - start; }
int main()
{char arr[] = "abcdefg"; size_t len = my_strlen(arr); printf("%zd\n", len);return 0;
}
运行结果:
分析:
- 创建一个字符数组,值为"abcdefg" , 随后,创建一个函数叫my_strlen,对它进行传参。创建len来接收my_strlen的值,最后打印该值。
- 进入函数内部,因为my_strlen传递的是数组首元素的地址,我们需要使用指针p来接收,并且使用const修饰指针p。my_strlen的返回类型是size_t。
- assert断言一下指针变量是不是为空,使用assert需要包含头文件。创建2个新的指针变量,分别为start和end,把p赋值给这2个指针变量。随后进行遍历,如果不是’\0’,end++。最后,end - start 也就是指针-指针,并且返回。
方法3
我们使用递归来解决,那么如何去使用递归?我们知道,使用递归需要遵循2个前提。
- 递归存在限制条件,当满足这个限制条件时,递归就不再继续。
- 每一次递归,都会接近限制条件。
当我们了解了这2个前提,那么我们就可以使用递归了。
代码如下:
//strlen函数的模拟实现
//方法3(递归)
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* p)
{assert(p != NULL); if (*p != '\0')return 1 + my_strlen(p + 1);elsereturn 0;
}
int main()
{char arr[] = "abcdefg"; size_t len = my_strlen(arr); printf("%zd\n", len); return 0;
}
运行结果:
分析:
- 创建字符数组,并且进行初始化;写一个函数my_strlen,创建一个变量len,接收值。最后,打印值。
- 进入函数内部,既然传递的是数组首元素的地址,我们就创建指针变量p来接收,我们不想让值进行改变,使用const修饰指针变量。my_strlen函数的返回类型与strlen函数一致,为size_t 。
- 使用assert断言一下,确保p不是空指针。使用assert需要保证包含头文件。
- 在前面,我们说了递归的使用方法,需要有一个限制条件,那么如果p不等于’\0’,就进行递归,否则,else 返回0。
总结
- 以上就是本文章的内容,我们使用了3个方法来模拟strlen函数。
- 感谢大家的阅读,希望能够给一个大大的关注~