strlen函数解析与模拟实现

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

一、strlen函数的介绍

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

下面是库中的strlen()函数:

size_t  strlen (const char* str);

说明:1.函数的参数为------const char* str->字符指针
2.返回值的类型------size_t:无符号整数(即:unsigned int)

计算下面的代码你觉得答案应该是多少?
-3?

int main()
{
	printf("%lld",strlen("abc") - strlen("abcdef"));

}

上运行结果
在这里插入图片描述
为什么答案这么大?
究其本质是:
计算结果是-3:
源码:10000000000000000000000000000011
反码; 111111111111111111111111111111111100
补码: 111111111111111111111111111111111101
在计算机中数是以补码的形式存储,strlen的返回结果是无符号整型,
所以,结果就是补码的大小。

二、strlen 函数的使用

案例一

数组初始化时使用双引号“”,则在最后自动补'\0'

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[10] = "aaaaabbbb";
	int n = strlen(arr);
	printf("数组arr的长度为:%d\n", n);
	return 0;
}

在这里插入图片描述

案例二

1.情况一

数组初始化时使用单引号'',则在最后不会自动补'\0'

	int main()
{
	char arr[5] = { 'a','b'};
	int num = strlen(arr);
	printf("数组arr的长度:%d\n", num);

	return 0;
}

在这里插入图片描述
如上数组arr实际内容为:
arr[0] = ‘a’
arr[1] = ‘b’
arr[2] = ‘\0’
arr[3] = ‘\0’
arr[4] = ‘\0’
所以strlen函数结果是2

2.情况二

#include <stdio.h>
#include <string.h>

int main()
{
	char arr[5] = { 'a','b','c','d','e' };
	int num = strlen(arr);
	printf("数组arr的长度:%d\n", num);

	return 0;
}

运行结果
在这里插入图片描述
注意:char arr[5] = { ‘a’,‘b’,‘c’,‘d’,‘e’ };和char arr[] = { ‘a’,‘b’,‘c’,‘d’,‘e’ };

经验证计算结果都为23。这是什么原因呢?别着急,我们只需要牢记一点strlen函数遇到’\0’就会停止。arr数组的实际存储情况是,‘a’、‘b’、 ‘c’ 、‘d’ 、‘e’五个字符依次存储在arr的字符数组中,并没有存储’\0’,,那么我们的strlen函数只能继续向后寻找’\0‘,所以,返回的值其实是一个随机值。

三、模拟实现strlen函数

使用指针相减的方法

#include <stdio.h>
#include <assert.h>
 
int point_strlen(const char* p)
{
	assert(p != NULL);
	char* start = p;
	while (*p != '\0')
	{
		p++;
	}
	return p - start;
}
int main()
{
	char arr3[] = "abcdef";
	int num3 = point_strlen(arr3);
	printf("字符串arr3的长度为:%d\n", num3);
 
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿然成长日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值