💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍
strlen函数解析与模拟实现
一、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;
}