1 关于Strlen
Strlen是C语言中的一种用于求字符串长度的函数 ( Str由string取来 len 由length得来) 他从第一个字符开始读取 直到读到 \0结束,所计算的字符串大小为‘\0’以前的字符所计算的值,最终的字符串长度不包括‘\0’
strlen因为是一种函数,因此调用这个函数需要引用的头文件是
形象的表达就是这个样子 字符串A到F 当读完最后一个字符F时 读取到斜杠0结束 字符串的长度就只有6而不是7 (这和sizeof有区别 后文讲述)
以下面一段代码为例
#include
#include
int main()
{
char arr[] = "abcdef";
printf("%d\n", (strlen(arr)));
return 0;
}
这里的strlen就用来求arr数组长度 输出结果就应该是6
顾名思义 strlen (string length)用于求字符串长度
sizeof ( the size of) 用于求字符串所占内存空间的大小
两者的最大区别就是这里
最直观的表现就是 strlen 不算斜杠0 而sizeof要算斜杠0
其最主要原因也就是两者定义不同 字符串长度不包含这个斜杠0 转义字符 就是人看到是几个字符就是几个字符, 而sizeof 中斜杠0 也确确实实存在于内存空间中 占据了内存的空间 所以在计算 字符串所占空间大小的时候就要算
举个栗子
#include
#include
int main()
{
char arr[] = "abcdef";
printf("%d\n", (strlen(arr)));
printf("%d\n", (sizeof(arr)));
return 0;
}
输出的值到底是多少呢?
相信你已经清楚的知道了 分别为6 和7。
了解了他们的区别
下面一起来看Strlen的实现吧
方法一:
按照定义直接法
#include
#include
int My_strlen( const char* ch)
{
int count = 0;
assert(ch != NULL);//p如果接收过来的是空指针,那么这里运行会崩溃的,所以这里用assert函数断言一下
while (*ch != '\0')
{
ch++;
count++;
}
return count++;
}
int main()
{
char arr[] = " abysfghk";
int len=My_strlen(arr);
printf("%d", len);
}
//这边说明一下最好把打印len放在下边 可移植性更强一点 上边函数的实现就是单纯的实现
注意传参的时候arr 数组名表示首元素地址 所以更应该用指针变量去接收这个地址
第二种方式 函数的递归
原理如下
若char[]="abc"则可以写成如下
1+my_strlen("bc")
1+1+my_strlen("c")
1+1+1+my_strlen("")--------1+1+1+0(空字符串第一个字符就是'\0')
代码如下
#include
#include
int My_strlen( const char* ch)
{
assert(ch != NULL);//p如果接收过来的是空指针,那么这里运行会崩溃的,所以这里用assert函数断言一下
if (*ch!='\0')
{
return 1 + My_strlen(ch + 1);//这里的加1表示读取下一位
}
else
{
return 0;
}
}
#include
#include
int main()
{
char arr[] = " abysfghk";
int len=My_strlen(arr);
printf("%d", len);
}
具体注意2点
首先是此处的if else语句的作用为判断是否这个数组有字符
如果没有就直接 return 0
其次 My_strlen(ch + 1) 表示读取下一位
方法三 指针减指针
用指针相减直接计算
两个指针相减,得到的是两个指针之间元素的个数 所以只要用字符串收尾两个指针相减就是整个字符串长度
例子如下
#include
#include
int My_strlen( const char* ch)
{
const char* start = ch;
assert(ch != NULL);//p如果接收过来的是空指针,那么这里运行会崩溃的,所以这里用assert函数断言一下
while (*ch!='\0')
{
ch++;
}
return ch - start;
}
#include
#include
int main()
{
char arr[] = " abysfghk";
int len=My_strlen(arr);
printf("%d", len);
}
这就是三种实习方法啦