目录
编辑
前言
1.strlen函数介绍
2.模拟实现strlen
2.1计数器做法
2.2不创建临时变量,通过递归的方法
2.3利用两个指针相减
3.结语
前言
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串 中或者 字符数组 中。
字符串常量 适用于那些对它不做修改的字符串函数.
1.strlen函数介绍
函数文件:
<string.h>
函数功能:从参数的地址开始,返回直到\0之前的字符个数。
返回值:类型:size-t 无符号整型
参数:const char *str 字符指针类型,通常得到字符串首元素的地址
①字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
②参数指向的字符串必须要以 '\0'结束。
③注意函数的返回值为size_t,是无符号的( 易错 )
对③进行解释:
看题目:
int main()
{
if (strlen("abc") - strlen("absdef") > 0)
{
printf("大于\n");
}
else
{
printf("小于等于\n");
}
return 0;
问:输出什么,正常按照整型返回值计算,返回一个是小于等于我们来看结果:
分析错误原因就是因为返回值是一个无符号的整型:
两者相减为-3
-3在内存中存储的原码为:10000000 00000000 00000000 00000011
反码: 11111111 11111111 11111111 11111100
补码: 11111111 11111111 11111111 11111101
当把这个 补码看做是一个无符号整型来进行打印,就会是一个非常大1的正数,所以打印大于。如果要正常我们可以这样修改代码
①利用强制类型转换
int main()
{
if ((int)strlen("abc") - (int)strlen("absdef")>0)
{
printf("大于\n");
}
else
{
printf("小于等于\n");
}
return 0;
②直接进行比较
int main()
{
if (strlen("abc") >strlen("absdef"))
{
printf("大于\n");
}
else
{
printf("小于等于\n");
}
return 0;
2.模拟实现strlen
2.1计数器做法
实现思想:定义一个计数用的变量,通过指针,指针指向的是字符串首元素的地址,那么我们只用解引用判断内容是不是与‘\0’相等就好,不相等我们的计数器就+1,指针向后移动,直到找到\0.
对于参数部分的考虑:这里传递过来字符串首元素的地址,那我们用一个字符指针来接收,我们只是求这个字符串的大小,不希望去改变他,用const限制
对于返回类型的考虑:①可以参照库函数将返回类型设置为无符号整型,因为字符串的长度始终是大于0的。
也可以设置为整型,这样就可以很好的解决上面的问题。
这就是我们的实现代码:
size_t my_strlen(const char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;//地址后移
}
return count;
}
int main()
{
size_t len = my_strlen("abc");
printf("%d\n", len);
return 0;
}
我们看一下效果:
2.2不创建临时变量,通过递归的方法
函数实现思想:
int my_strlen(const char * str)
{
if(*str == '\0')
return 0;
else
return 1+my_strlen(str+1);
}
这里大家可以参照图解来理解代码,
2.3利用两个指针相减
实现思想:两个指向同一块空间的指针相减得到的绝对值是两个指针之间元素的个数。那么我们使用一个指针变量保存最开始字符串首元素的地址,然后让其往后移动直到找到\0,再利用两个指针作差,看一下实现:
int my_strlen(char *s)
{
char *p = s;
while(*p != ‘\0’ )
p++;
return p-s;
}
3.结语
以上就是本期的所有内容,知识含量蛮多,大家可以配合解释和原码运行理解。创作不易,大家如果觉得还可以的话,欢迎大家三连,有问题的地方欢迎大家指正,一起交流学习,一起成长,我是nicn,正在c++方向前行的新手,感谢大家的关注与喜欢。