strlen函数是一个位于C标准库<string.h>的库函数
是用以计算字符串长度的函数,即为计算 ‘\0’前字符的数量
函数的声明与使用
size_t strlen(const char *str)
参数类型是 字符指针,在调用strlen函数时,需将数组的数组名(也就是首元素地址)传给strlen函数,strlen函数会以此地址为起始位置,向后计算字符串长度。
返回值类型是 size_t,其实也就是 unsigned int 类型。
举个例子
int main()
{
char arr[] = "123456789";
size_t sz = strlen(arr);
printf("%u", sz);
return 0;
}
strlen函数的使用非常简单,但有两个需要注意的地方
1.只有strlen函数找到 \0 时,方会停止计算长度。诺所需求长度的字符数组中无 \0,strlen会自起始坐标往后,一直寻找\0,直到找到\0为止。此时函数的返回值是随机的。
int main()
{
char arr[] = {'1','2','3','4','5'};
size_t sz = strlen(arr);
printf("%u", sz);
return 0;
}
2.strlen的返回值是 size_t类型的,即无符号整型。
在比较两字符串长度时,不建议使用相减的形式
比如以下这个情况
int main()
{
char arr1[] = "123456";
char arr2[] = "123456789";
size_t sz1 = strlen(arr1);
size_t sz2 = strlen(arr2);
if (sz1 - sz2 > 0)
printf("arr1 > arr2");
else
printf("arr1 < arr2");
//printf("%u", sz);
return 0;
}
size_t相减时,整个表达式会发生算数转化,在内存中存放的-3的补码会被看作是size_t类型数据的补码,因size_t类型的原反补相同,也就是-3的补码将被看做是表达式结果的原码,是一个非常打的数字。
strlen函数的三种模拟
三种模拟,实际上都是以找\0为根本的,借助不同的思想,完成对字符串长度的计算
1.计数器实现
size_t my_strlen(char* str)
{
assert(str != NULL);
int count = 0;
while (*(str + count++) != '\0');
return --count;
}
2.递归实现
size_t my_strlen(char* str)
{
if (*str != '\0')
return my_strlen(str + 1) + 1;
else
return 0;
}
3.指针实现
size_t my_strlen(char* str)
{
char* ret = str;
while (*str++);
return str - ret-1;
}