strlen()是一种(计算字符串的长度)的库函数。它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)取决于传给strlen参数的首地址。开始扫描字符串直到\'0'结束,其返回值不包括'\0'。
原型
size_t strlen ( const char * str );
由原型可知 strlen的参数是 char*类型的指针 返回值size_t(unsigned int)因为计算的字符串最少也是零不可能是负数所以为size_t(unsigned int)
实例 打印的结果是什么?
int main()
{
char* ch1 = "abc";
char* ch2 = "abcdef";
if (strlen(ch1) - strlen(ch2) > 0)
{ //3-6 =-3 其返回值要提升为无符号整形
//既-3的符号位1不在表示负数 那么对应的二进制数将会很大
printf("OK");
}
else
{
printf("NO");
}
return 0;
}
那么如何实现my_strlen?根据strlen的实现原理 传入一个char*的指针(字符串的首地址),解引用这个指针(地址)然后开始寻找'\0',找到后返回 (解引用的指针(首地址)到'\0')之间的字节的个数(字符串的长度)但不包括'\0'一个sizt_t(无符号的整形)
1.创建临时变量来模拟strlen(以下均在vs2019 32位)
int my_strlen(const char* str)//创建临时变量
{
assert(str);//断言一下 str不能是空指针
int count = 0;//记录字符串的长度
while (*str != '\0')//如果*str(解引用首地址)不是'\0'
{
str++; //那么str++找到下一个字符的地址
count++; //此时count++ 记录下长度
}
return count;//当*str是'\0'跳出循环 返回count的值
}
2. 不创建临时变量
int my_strlen( const char* str)//不创建临时变量(用递归)
{
assert(str);
if (*str)//如果*str(解引用首地址)不是'\0'
{
return 1 + my_strlen(str+1);//my_strlen("abcdef");
} //1+my_strlen("bcdef");
else //1+1+my_strlen("cdef");
{ //……
return 0; //1+1+1+1+1+1my_strlen("");
}
}
3.采用指针减去指针
int my_strlen(const char* str)//指针减指针
{
assert(str);
const char* start = str;
while (*str)
{
str++;
}
return str - start;//指针减指针(两个地址之间相隔的单位个数)
//
}