一,strlen()函数的实现
int my_strlen(const char* arr)
{
assert(arr != NULL);
int ret = 0;
while (*arr)
{
ret++;
arr++;
}
return ret;
}
二,strlen()计算字符串,字符数组,数字数组的长度
① 字符串:
两种定义方式都可以用 strlen()计算长度。(只要strlen()里放的是个地址,就行)
② 字符数组:
警告:
1. strlen()可以对,一系列单个字符进行计数,知道遇到‘\0',停止计数。
2. b3 和 b4 的区别:
b4 一定是 4,因为它第 5 位就遇到 ‘\0'了,也就是0,strlen()计数就停止了,但 b3 此处是恰好第 5 位是 0,所以它也停止了计数,不然它会一直计数知道碰到 0。
所以:b3 结果是一定的,而 b4 结果会随机(主要是看后面的内存里放的是什么)。
③ 数字数组:(以 int[5] 型数组为例)
解释如下:
图中一个方格表示一个字节,int[5] 共 20个字节,图中只画出来 16 个字节,也就是前 4 个 int 变量,这 4 个进行了初始化,分别为 1,2,3,0。
int c1[5] 用 strlen(),将 c1 传入了函数,strlen(c1),但通过上面的 strlen()的实现,可以看到 strlen()函数是用 char * 类型的变量接受的,而 c1 本身是 int* 类型的,所以,进行了强制类型转换,将 c1 变为了 char* 类型,那 char* 类型变量,向后走一个是走 1 个字节,即走到第二个紫色格子处,而 int* 类型变量,向后走一个是走 4 个字节,即走到第一个绿色格子处。
所以,在 ret 计数了一个之后,会往后走一步,走 1 个字节,走到第二个紫色格子处,而第二个紫色格子里放的是0,(因为每种颜色的格子是一个 int 变量的 4 个字节,即,紫色的 4 个格子是 c1[0] 的 4 个字节,而 c1[0] 是 1,1 占用不了全部的 4 个字节,只占用了 1 个字节,所以后三个紫色格子是0),strlen()碰到 0 就结束计数了,所以打印出来的结果是 1。
当 c1[0] 数字足够大的时候,分配给它的 4 个字节里都不会是 0 了,此时用 strlen()就不会是 1了。
四个字节都不是0,接着往下是2,再下个字节是0,所以共5个。