前言
在c语言中strlen是求字符串长度的函数,strlen在求长度的过程中寻找的是\0(字符串结束标志)
那么在不使用库函数下我们该如何实现呢
下面我们讲第一种方法,也是最常见的方法
首先我们创建一个char 类型的数组,数组的内容初始化成abc
然后写一个自己的函数这里的函数名可以自定义这里我写的是print
我们在传参的时候传的是数组,那么我们在接受的时候也可以写成数组的形式接收,还可以写成指针的方式接收, 因为数组在传参的时候传的是首元素的地址,所以这里写成指针的形式哦
当我们进入到print函数内部时 我们首先创建一个临时变量,叫count 也就是统计的
紧接着就是while循环,这时指针p指向的是数组的首元素,那么我们判断当指针p什么时候指向的元素是/0时 那么我们就停下循环,当指针每指向一个元素且不是/0时,那么我们就给我们的count++,然后指针p也++如此循环下去当指针p指向/0是我们的count里存放的数字也就是字符串的长度
方法一:使用循环遍历
步骤说明:
- 创建一个
char
类型的数组,并初始化。 - 编写一个自定义函数
print
,该函数接收一个char
指针作为参数。 - 在函数内部,使用一个临时变量
count
来统计字符串的长度。 - 使用
while
循环遍历字符串,直到遇到空字符\0
为止。每遍历一个字符,count
增加1,指针也向前移动一位。 - 当遇到空字符
\0
时,退出循环并返回count
作为字符串的长度。
代码实现:
int print(char* p)//第一种方法用函数来实现
{
int count = 0;
while (*p != '\0')
{
count++;
p++;
}
return count;
}
int main()
{
int len = 0;
char ch[] = "abc" ;
len=print(ch);
printf("字符串的长度是%d\n", len);
return 0;
}
第二种方法
指针-指针
我们说指针-指针的方法来实现时我们要先了解指向的类型对指针进行操作时有什么影响
指针类型决定了指针进行解应用操作的时候能够访问空间的大小。
int*p可以访问4个字节
short*可以访问2个字节
char*p可以访问1个字节
double*p可以访问8个字节
指针类型决定了:指针走一步走多远(指针的步长)
int*p;p+1 --> 4
char'p; p+1-->1
double* p; p+1-->8
这里我们进入print函数首先我们可以看到有两个char*类型的指针变量
是个方法的实现逻辑是,str指针指向数组的第一个元素,end指针指向数组的最后一个元素
然后相减得到的就是字符长的长度
分别是str 和 end 此时两个指针指向的都是p也就是数组的首元素的地址
进入while循环当end指针指向的元素不是/0是我们就++如果是/0那么此时end指针指向的位置就是数组的最后一个元素所在的位置,并且跳出循环,在直接返回得到的就是字符串的长度
方法二:使用指针减法
步骤说明:
- 创建一个
char
类型的数组,并初始化。 - 编写一个自定义函数
print
,该函数接收一个char
指针作为参数。 - 在函数内部,创建两个指针
str
和end
,都指向字符串的起始位置。 - 使用
while
循环遍历字符串,直到end
指针遇到空字符\0
为止。每次循环end
指针向前移动一位。 - 当
end
指针遇到空字符\0
时,退出循环。 - 返回
end - str
的值,即为字符串的长度。
代码实现:
int print(char* p)//第二种方法指针减指针
{
char* str = p;
char* end = p;
while (*end != '\0')
{
end++;
}
return end - str;
}
int main()
{
int len = 0;
char ch[] = "bit" ;
len=print(ch);
printf("字符串的长度是%d\n", len);
return 0;
}
以上就是我对这两种方法的看法,欢迎大神补充,当然还有一种递归的方法就放到下次在讲吧
注意事项
- 初始化数组时要包含空字符
\0
:- 如果你这样初始化数组
char ch[] = {'a', 'b', 'c'};
,则数组中不会自动包含空字符\0
,这会导致strlen
或自定义函数无法正确计算字符串长度。 - 正确的做法是使用双引号初始化字符串,例如
char ch[] = "abc";
。在这种情况下,编译器会自动在字符串末尾添加空字符\0
。
- 如果你这样初始化数组
这里要注意一下,我们在初始值数组的时候不要写成以下这种形式
如果这样写的话就不能正常的求字符长的长度
因为这样子初始化的话,我们知道strlen在求字符串长度的时候找的是/0如果这样初始化那么在我们从受元素向后找的时候就会发现找不到/o,就会在内存中一直向后找。此时得到值不是字符串的长度而是随机值
int main()
{
char ch[]={'a','b','c'};
return 0;
}
如果写成整个方式的话,用双引号括起来的字符串我们叫常量字符串,一般/0都会自动隐藏在字符串的最后面,此时这个数组在内存中存储的东西是 a,b.c./0
因为/0默认是隐藏不显示的,而上面的写法里面就没有/0那也就是为什么上面那种方式最后求出来的结果是随机值的原因
int main()
{
char ch[]="abc";
return 0;
}
总结
本文介绍了两种不使用库函数 strlen
的方法来计算字符串长度。第一种方法通过循环遍历字符串,第二种方法通过指针减法来计算长度。无论使用哪种方法,都需要确保字符串以空字符 \0
结尾,以便正确计算其长度。