(一)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;
else
return 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;
}