目录
一、strlen函数介绍
当我们在求一个字符串的长度时,经常会使用到strlen()这个函数,那么它具体是怎样实现的呢?首先让我们先了解一下这个函数。
size_t strlen ( const char * str );
1.字符串以 '\0' 作为结束标志,strlen函数返回的值就是在字符串中'\0'的前面出现的个数(不包含'\0')
2.参数指向的字符串必须要以 '\0' 结束。
假如有一个存放字符串的数组:
char arr[ ]="abcdef" 这个数组中存放的内容其实是 a,b,c,d,e,f,\0这7个字符,arr为数组名,也表示数组首元素地址,从首元素开始,直到遇到 ' /0 '结束,这样就能准确的计算出字符串的长度。如果数组初始化为以下这种形式:char arr[ ]={'a', 'b' ,'c' ,'d' ,'e' ,'f' },那么使用strlen计算的字符串长度就是一个随机值,因为参数指向的字符串不包含' \0 '。
3.注意函数的返回值为size_t是无符号的,就是unsigned int
二、实现strlen的三种方法
1、第一种方法(计数)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str) //计算字符串长度,字符串的内容是不会被改变的,所以最好用const修饰一下,保证数据的安全性。
{
assert(str != NULL); //断言,指针不为空
int count = 0; //计数
while (*str != '\0')
{
count++; //当它的字符不等于'\0'时,计数加一
str++; //指向下一个字符
}
return count;
}
int main()
{
char arr[] = "abcdef";
int ret=my_strlen(arr);
printf("%d\n", ret);
return 0;
}
2.第二种方法(递归)
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)//计算字符串长度,字符串的内容是不会被改变的,所以最好用const修饰一下,保证数据的安全性。
{
assert(str != NULL);//断言,指针不为空
if (*str != '\0')
{
return 1 + my_strlen(str + 1);
}
else
{
return 0;
}
}
int main()
{
char arr[] = "abcdef";
int ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
3.第三种方法(指针-指针)
两个指针相减,得到的是两个指针之间元素的个数。我们先用一个指针放首字符地址,然后再找到最后一个字符的地址,用最后一个字符地址减去第一个字符地址,就是他们之间元素个数。
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)//计算字符串长度,字符串的内容是不会被改变的,所以最好用const修饰一下,保证数据的安全性.
{
assert(str != NULL);//断言,指针不为空
const char* start = str;//定义一个指针放字符串首字符的地址,因为*str接收的字符串为常量字符串,所以这里最好也用const修饰一下
while (*str != '\0')
{
str++;
}
return str - start;
}
int main()
{
char arr[] = "abcdef";
int ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
三、总结
以上就是实现strlen的三种方法,知道了strlen具体是怎样实现的,就会让我们在使用strlen函数的过程中更加清晰和熟练,不容易出现错误。