C语言:认识库函数strlen

1.初始strlen库函数

strlen是一个很常见的库函数,通常计算的是字符串str的长度,从字符的首地址开始遍历,以 '\0' 为结束标志,然后将计算的长度返回,计算的长度并不包含'\0'。

cplusplus网站中,strlen库函数的详细解释如下

  1. 函数的参数为------const char* str:字符指针
  2. 返回值的类型------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),从而停止遍历。如下图所示:

 

  • 20
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值