strlen函数的介绍
strlen函数是C语言中的一个字符串处理函数,用于计算一个字符串的长度,即该字符串中包含的字符数(不包括字符串结尾的’\0’),头文件为<string.h>,基本语法为size_t strlen(const char *str);
strlen函数的使用
#include<stdio.h>
#include<string.h>
int main()
{
char arr[20] = "hello word";
printf("%zd", strlen(arr));
return 0;
}
输出结果
strlen函数的返回类型为size_t,所以使用%zd输出(%zd为无符号整型)
strlen函数的注意事项
参数指向的字符串必须要以 ‘\0’ 结束
接下来看一串没有\0的代码
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = {
'a','b','c' };
printf("%zd\n",strlen(arr));
return 0;
}
字符‘a’,‘b’,‘c’ 三个字符依次存储在arr数组中,并没有存储\0,所以c后面是什么我们并不知道,但是strlen计算的是\0之前的字符数,所以这里返回的是一个随机值。所以我们在使用strlen函数时应检查字符串中是否有\0。
strlen函数的模拟实现
一、计数器的方法
#inlcude<stdio.h>
#include<assert.h>
size_t my_strlen(const char* arr)
{
int count = 0;
assert(arr!=NULL);
//定义一个count变量,计算出arr元素的个数
//遍历arr数组当*arr不等于\0时count++;
while (*arr != '\0')
{
count++;
arr++;
}
//最后将count返回
return count;
}
int main()
{
char arr[] = "hello word";
size_t ret = my_strlen(arr);
printf("%zd\n", ret);
return 0;
}
输出结果
注:assert() 宏接受⼀个表达式作为参数。如果该表达式为真(返回值⾮零), assert() 不会产⽣任何作⽤,程序继续运⾏。如果该表达式为假(返回值为零), assert() 就会报错,在标准错误流 stderr 中写⼊⼀条错误信息,显⽰没有通过的表达式,以及包含这个表达式的⽂件名和⾏号。使⽤ assert() 有⼏个好处:它不仅能⾃动标识⽂件和出问题的⾏号,还有⼀种⽆需更改代码就能开启或关闭 assert() 的机制。如果已经确认程序没有问题,不需要再做断⾔,就在 #include <assert.h> 语句的前⾯,定义⼀个宏 NDEBUG 。
二、地址相减的方法
#inlcude<stdio.h>
#include<assert.h>
size_t my_strlen(const char* arr)
{
const char* start = arr;
//将arr的首元素地址存放start中
assert(arr!=NULL);
while (*arr != '\0')
{
arr++;
}
//遍历arr,此时arr的位置来到了\0
return arr - start;
//将arr - start的值返回
}
int main()
{
char arr[] = "hello word";
size_t ret = my_strlen(arr);
printf("%zd\n", ret);
return 0;
}
输出结果
三、递归的方法
size_t my_strlen(char*arr)
{
if (*arr != '\0')
{
return 1 + my_strlen(arr + 1);
}
//当arr!= \0时让1+my_strlen(arr+1),此时arr+1指向'e'的位置,再重复此操作
else
{
return 0;
}
}
int main()
{
char arr[] = "hello word";
size_t ret = my_strlen(arr);
printf("%zd\n", ret);
return 0;
}
输出结果
总结:在使用strlen函数时应注意字符串中有没有包含\0