目录
前言
还是从头开始写吧,一个一个慢慢来,好好的系统复习一下。
strlen肯定是很多初学者刚开始接触字符串时很"喜欢"的一个函数,并且你以为的它的好兄弟是sizeof,但其实它俩差的太多了。
用法简介
1.strlen
对于传的参数,很简单,那就是传一个字符串的地址过去啦,毕竟它只是要计算一个字符串的长度即此字符串中在\0之前的字符个数,并将其作为返回值返回。(但在C语言本身是没有设置字符串变量类型的。)
size_t strlen(const char* str);
size_t其实就是unsigned int
这个就是容易犯错的地方。你如果·······
语言匮乏,上代码
你觉得结果是什么?
记住返回值是无符号整形哦
运行结果
无符号整形的计算结果还是无符号,除非你那有符号整形接收计算结果哦。
2.字符串的简介
当然,字符串也是分常、变的。
常量字符串
注意看,它存的是什么。什么需要拿一个char*指针来接收,不管咋地,它得是一个地址,它的确是一个地址,并且是首元素a的地址,所以常量字符串创建时需得拿一个字符指针接受首元素的地址,方便你找到它并读取它。
它跟用数组创建的字符串最大的区别就是它的元素不能被更改,而数组就随你便了。当然还有一个小区别,既然它不能被更改,那你在创建两个相同常量字符串的时候计算机会不会也开辟两块空间去存储两个相同的不能被更改只能被读取的常量字符串呢?
答案肯定是否定的。这个就不过多解释了。
变量字符串
即用数组创建的可被读取也可被更改的字符串。这个暂时没那么多槽点,不过多介绍了。
但无论 常 还是 变 都要注意,单引号的是字符,而双引号才是字符串,并且会在你的这个双引号的字符串后部自动加上一个\0。如果很喜欢用单引号一个一个字符的放入数组中,不要忘了加上一个'\0',否则很多字符串库函数都可能会出现错误的。
sizeof简单对比
这两个很多博客都有详细的叙述,我就不再赘述了。只是简单的说一下,sizeof并不是一个函数,而是一个关键字(你用它的时候可以看见它跟int,char,double等是一个颜色的,也就是说他们其实是相亲相爱一家人),它就是计算你所给的值或类型的所占内存的字节大小,而strlen同大多数字符串库函数一样,就是以\0为标准,遇见\0就停止它的操作了,对于strlen来说就是不在往下查字符个数了,将它在遇到\0之前的字符个数作为返回值返回。
简单实现
my_strlen
简单的说一下,这里我就用有符号整形返回值了,其实两者各有利弊吧,我也不再赘述。
上代码
计数器版
#include<assert.h>
int my_strlen(const char* str)//const 毕竟只是查数而已,为避免错误操作,
//将其作为常变量接受,保险一些,也为以后培养一个好习惯
{
assert(str);//断言
int count = 0;//计数器
while (*str++)//遇到\0循环停止
{
count++;//每一个非\0字符都会进入循环,则计数器加1
}
return count;//返回计数器的值即字符串长度
}
指针运算版
int my_strlen(const char* str)
{
assert(str);
char* start = str;//记载首元素地址
char* end = str;//记录尾元素的地址,但目前不是尾元素啦,经过下列操作后就是了
while (*end)//循环原理同计数器版
{
end++;
}
return(end - start);//两个指针之间的差就是两指针间元素的个数。
}
递归版
//递归版
//假设有一个字符串"abc"
//递归的思想就是将大事分解成小事
//那就这样计算"abc"可以看为计算a + "bc"
//a肯定算出来是1,所以就是1 + "bc"
//再分解就是1 + b + "c"
//同理1 + 1 + "c"
//同理1 + 1 + 1 + ""
//此时""里还有\0, 不算长度,那就是0
//所以1 + 1 + 1 + 0 = 3;
int my_strlen(const char* str)
{
assert(str);
if (*str)//如果此字符串不是\0,条件成立进入
//能进入就说明目前至少有一个字符,那就返回(1 + 剩下的字符计算)
return (1 + my_strlen(str + 1));
else//遇到\0就进入这里,因为\0不计入长度,对于此字符返回0,
return 0;
}
库中的实现
它是用指针运算的方法
补充
完!!
Thanks!
See you next time!