1.初始strlen库函数
strlen是一个很常见的库函数,通常计算的是字符串str的长度,从字符的首地址开始遍历,以 '\0' 为结束标志,然后将计算的长度返回,计算的长度并不包含'\0'。
在cplusplus网站中,strlen库函数的详细解释如下
- 函数的参数为------const char* str:字符指针
- 返回值的类型------size_t:无符号整数(即:unsigned int)
2.strlen库函数与关键字sizeof()的比较
2.1.关于sizeof()的认识
sizeof是C语言中的一个关键字,sizeof(a)表示的是a所占内存空间的大小,单位是字节。在字符数组中会统计‘\0’所占空间。其返回类型为size_t类型,C99和C11提供%zd转换说明匹配sizeof的返回类型(即,size_t类型)。一些不支持C99和C11的编译器可用%u和%lu代替%zd。
2.2.关于strlen的认识
strlen是string库中的的一个库函数,其参数是一个指向字符串常量或者字符数组的的指针,用于计算指针指向的字符串的大小,当遇到‘\0’停止计数,不会统计‘\0’。
具体比较如下
int main()
{
char *p = "hello";
char arr1 []= "hello";
char arr2[] = { 'h', 'e', 'l', 'l', 'o' };
printf("%d\n", sizeof( p));
//结果4,因为指针变量的所占空间大小仅仅和操作系统位数有关32-4,64-8
printf("%d\n", sizeof(arr1));
//结果6,字符串默认以\0结尾,sizeof()包含\0的计算
printf("%d\n", sizeof(arr2));
//结果为5,因为为字符型表示,并不含有\0(仅仅字符串有\0)
printf("%d\n", strlen( p));
//结果为5,strlen求的是字符串的长度,不包含\0
printf("%d\n", strlen(arr1));
//结果为5,strlen求的是字符串的长度,不包含\0
printf("%d\n", strlen(arr2));
//因为字符型不包含\0,但字符串需要找到\0才可结束,
//所以在'o'之后继续向后读取直到找到\0,所以是一个随机值
return 0;
}
所以运行起来结果如下:
3.strlen库函数的模拟实现
3.1计数器计数
#include <stdio.h>
#include <assert.h>
int My_strlen(const char* pf)
{
assert(pf != NULL);
//断言,保证p不为空
int sum = 0;
while (*pf != '\0')
{
sum++;
//记录个数
pf++;
//指针后移
}
return sum;
//返回总个数
}
int main()
{
char arr1[] = "abcdefg";
int num1=My_strlen(arr1);
printf("字符串arr1的长度为:%d\n", num1);
return 0;
}
3.2递归计数
#include <stdio.h>
#include <assert.h>
int My_strlen(char* pf)
{
assert(pf != NULL);
//断言,保证pf不为空
if (*pf != '\0')
{
return 1 + My_strlen(++pf);
//依次递归计数
}
else
{
return 0;
}
}
int main()
{
char arr2[] = "abcdef";
int num2 = recursion_strlen(arr2);
printf("字符串arr2的长度为:%d\n", num2);
return 0;
}
3.3 指针相减计数
#include <stdio.h>
#include <assert.h>
int My_strlen(char* pf)
{
assert(pf != NULL);
//断言,保证pf不为空
char* start = pf;
//存储初始位置
while (*pf != '\0')
{
pf++;
}
return pf - start;
//指针相减记录个数
}
int main()
{
char arr3[] = "abcd";
int num3 = My_strlen(arr3);
printf("字符串arr3的长度为:%d\n", num3);
return 0;
}
4.strlen库函数的扩展运用
strlen是一个很常见的库函数,通常计算的是字符串str的长度,从字符的首地址开始遍历,以 '\0' 为结束标志,然后将计算的长度返回,计算的长度并不包含'\0'。
由于'\0'的ASCII码的值为0,所以某些情况下计数,当遇到0时,strlen同样会停止遍历。
具体事例如下
int main()
{
char a[1000];//0~999
int i;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
//-1 -2 -3 -4 ... -127 -128 127 126 ... 4 3 2 1 0 -1 -2 ...
printf("%zd", strlen(a));
//求得是字符串的长度,统计的是\0(ASCII码值是0)之前的字符个数
//255
return 0;
}
程序运行结果如下:
其原因是由于 char类型在数据内存中的范围是00000000~11111111(0~127,-128~-1)
所以127+128+255,即在转一圈后strlen遇到了0(ASCII值为0),从而停止遍历。如下图所示: