strlen函数剖析和模拟实现
❤️函数剖析和模拟实现
💙 函数剖析
函数原型:
size_t strlen (const char* str)头文件: <string.h>
作用(function): Get string length
翻译翻译: 获取字符串中位于\0之前的字符个数。
参数:const char* str
翻译翻译: 接收一个字符指针。
举例:
int main() { char str1[] = "abcdef"; //将字符串存入字符数组 char* str = "123456"; //str为指针变量,存放字符串首元素的地址 int len1 = strlen(str1); // 数组名为首元素地址,将其传给strlen int len2 = strlen(str); //将str传给strlen return 0; }
返回类型: size_t(无符号整型)
翻译翻译: 返回一个大于等于0的正整数。
💜 三种方法模拟实现strlen
🏃 1、迭代的方法实现strlen
#include<assert.h>
size_t my_strlen(const char* str)
{
assert(str); //因为需要对str进行解引用,防止str为NULL而导致出错
int count = 0;
while(*str++) //'\0'的ASCLL码值为0,可以用来作为循环结束条件
{
count++;
}
return count;
}
👫 2、指针 — 指针
指针 — 指针:两个指针相减的绝对值为指针和指针之间的元素个数,前提是:指向同一块空间的指针才能相减
#include<assert.h>
size_t my_strlen(const char* str)
{
assert(str);
char* start = str;
while(*str != '\0')
{
str++; //令str找到位于\0之前的地址
}
return str - start; //指向同一块空间的指针相减,返回其之间的元素个数
}
👪 3、递归方法
#include<assert.h>
size_t my_strlen(const char* str)
{
assert(str);
if(*str != '\0')
{
return 1 + my_strlen(++str); //当str所指向的内容不为'\0'的时,便进行递归,str指向下一个内容
}
else
{
return 0;
}
}
💚 注意事项
1、对于返回参数的认识
举例:
分析下面的代码:
解答:
strlen(arr1)得到的结果肯定为3,strlen(arr2)得到的结果肯定为4,那怎么会打印出 "arr1 > arr2"的结果呢?
因为strlen函数的返回类型为size_t的无符号整型,那么两个无符号整型相减的结果也必为无符号整型,即结果必定大于等于0.
所以在使用strlen函数返回的结果比较两个字符串的长度时,应尽量使用关系操作符进行比较。
2、strlen使用时注意
①:strlen函数计算的是\0之前的字符个数,如果字符串中就有\0,那计算的结果会提前结束
②:strlen函数需要的参数为一个地址,不能为常量,更不能为野指针。