(一)strlen函数的使用
strlen函数的演示
#include <stdio.h>
#include <string.h>int main()
{char arr1[] = "abcdef";char arr2[] = "good";printf("arr1 = %d,arr2 = %d",strlen(arr1),strlen(arr2));return 0;
}
(二)strlen使用的注意事项
• 参数指向的字符串必须要以 '\0' 结束。
• strlen的使用需要包含头文件 <string.h>
• 注意函数的返回值为size_t,是无符号的( 易错 )
//注意函数的返回值为size_t,是无符号的( 易错 ) #include <stdio.h>
#include <string.h>
int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if (strlen(str2) - strlen(str1) > 0)//无符号的两个数相减{printf("str2>str1\n");}else{printf("srt1>str2\n");}return 0;
}
为何输出的结果与预期的不同?
strlen的返回值类型是无符号型,无符号型-无符号型还是无符号型,因此最后的结果一定是大于0的。
因此在比较两组字符串大小时,我们应采用直接比较的方式
(三)strlen的模拟实现
方式1:使用函数模拟strlen
//计数器方式
//使用函数模拟strlen#include <stdio.h>
#include <assert.h>int my_strlen(const char* str)
{int count = 0;assert(str != NULL);//断言 防止str为空指针while (*str)//while (*str != '\0'){count++;str++;}return count;
}int main()
{char arr[] = "abcdef";int len = my_strlen(arr);printf("%d", len );return 0;
}
方式2:使用递归的方式
//不能创建临时变量计数器
//3:使用递归方式
#include <stdio.h>
#include <assert.h>int my_strlen(const char* str)
{//assert(str != NULL);if (*str == '\0')return 0;elsereturn 1 + my_strlen(str+1);//疑问:为什么无法使用str++?
}int main()
{char arr[] = "abcdef";int len = my_strlen(arr);printf("%d", len);return 0;
}
//疑问:为什么无法使用str++?
答:后置++ 是先使用后自增
所以这里如果这样写 传进去的那个地址值就还是原本的指向
如果用str++ 先使用 后自增 这里的使用表示传参 所以就只会把a的地址传进去 就不符合我们的预期了
这里我们可以调试观察。
一、str++的调试结果
在程序进行中,每次进入新阶段前,str的地址发生了改变,但是进入新阶段后,仍是原地址。
二、使用++str的调试结果
str所指向的地址发生了变化。
因此,我们在此处希望由a的地址转换到b的地址,可使用str+1或前置++str的方式。
方式3:指针-指针的方式
//使用指针-指针的方式
#include <stdio.h>
#include <assert.h>int my_strlen(const char* str)
{assert(str);char *s = str;while (*s != '\0')s++;return s - str;//指针-指针=之间元素的个数
}int main()
{char arr[] = "abcdef";int len = my_strlen(arr);printf("%d", len);return 0;
}