一、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; }