1.什么是strlen函数
strlen函数是包含在<string.h>函数库里的一种计算字符串长度的函数,如果要知道如何用函数办法实现strlen我们需要知道strlen的实现机理。
- 字符串以'\0'作为结束标志,而strlen函数返回的是在字符串中'\0'之前出现的字符个数(不包含'\0')。
- 参数指向的字符串必须要以'\0'结束
- 注意函数的返回值为size_t,它属于无符号数
2.无符号数的体现
我们现在可以来看一段代码
#include<stdio.h>
#include<string.h>
int main()
{
char a[] = "1234";
char b[] = "12";
if (strlen(b) - strlen(a) > 0)
printf("<\n");
else
printf(">=\n");
return 0;
}
你觉得会输出什么呢?是'>='吗?
这里我们能看到输出的并不是'>='而是'<',为什么呢?
因为strlen返回的值为无符号数,因此虽然我们主观上认为输出的负数,但其实是一个极大的正数,因而无论怎么样都只会输出<,除非两者相等。
那么我们怎么避免这种情况呢?
1.我们可以直接判断两者大小,也就是将两者放到判断符号两端。2.我们还可以转换strlen返回值为int型。
3.种函数实现strlen
直接上代码
3.1简单粗暴的循环自增
size_t my_strlen(const char *arr)//防止字符串被更改,当然也可以不加const
{
int count = 0;//定义用来计数的变量
assert(arr != NULL);//防止空指针,此处使用断言,但是别忘记头文件<assert.h>
while (*arr != '\0')//循环
{
arr++;//指针后移
count++;//计数器
}
return count;
}
3.2递归实现strlen
size_t my_strlen(const char *arr)//const可去
{
assert(arr != NULL);//断言,需<assert.h>
if (*arr != '\0')//如果当前不是'\0',则长度+1,然后递归判断下一个位置是否为'\0',直至遇到'\0'结束递归;
{
return 1 + my_strlen(arr + 1);
}
else
{
return 0;
}
}
3.3指针减指针
size_t my_strlen(const char *arr)
{
assert(arr != NULL);
char *start = arr;//保存首地址
while (*arr != '\0')//循环
{
arr++;//指针后移
}
return arr - start;//结束地址减去开始地址就是字符个数
}