库函数strlen的三种模拟实现方式


一、库函数strlen的认识

关于库函数strlen我们可以从以下链接中认识:库函数strlen是求字符串长度的函数
https://legacy.cplusplus.com/reference/cstring/strlen/?kw=strlen

size_t strlen ( const char * str )

注意
字符串以 ‘\0’ 作为结束标志,库函数strlen 返回的是在字符串中 ‘\0’ 前面出现的字符个数但是不包括’\0’,双引号(“”)末尾是隐藏着一个 '\0’的

参数指向的字符串必须要以 ‘\0’ 结束

函数的返回值是 size_t ,是无符号的

二、库函数strlen的使用

#include <stdio.h>
#include <string.h>//使用库函数strlen需要的头文件
int main()
{
    
    
	char arr[] = "abcdef";
	int ret = strlen(arr);
	printf("%d\n", ret);
	return 0;
}

运行结果:
在这里插入图片描述

#include <stdio.h>
#include <string.h>
int main()
{
    
    
	char arr[] = {
    
     'a','b','c','d' };//没有字符'\0'
	int ret = strlen(arr);
	printf("%d\n", ret);
	return 0;
}

因为要读到’\0’才会停下来,但是程序中没有’\0’所以得到的是随机值
在这里插入图片描述

int main()
{
    
    
	char arr1[] = "abcd";
	char arr2[] = "abcdef";
	if (strlen(arr1) - strlen(arr2) > 0)
		printf(">=\n");
	else
		printf("<\n");
	return 0;
}

因为库函数strlen的返回值是suze_t(无符号整型),所以是大于0的
在这里插入图片描述

三、库函数strlen的三种模拟实现方式

1、用计数器的方式实现

#include <stdio.h>
int my_strlen(const char* str)
{
    
    
	int count = 0;//设置计数器
	while (*str!='\0')//对指针进行解引用找到那个值,若那个值不等于'\0'则向后依次找
	{
    
                     //直到找到'\0',结束循环
		count++;//每次找到一个值,计算器++
		str++;
	}
	return count;//循环结束返回计数器的值
}
int main()
{
    
    
	char str[] = "abcdef";
	int len = my_strlen(str);
	printf("%d\n", len);
	return 0;
}

在这里插入图片描述

2、用函数递归的方式

#include <stdio.h>
int my_strlen(const char* str)//每次递归都会使指向首元素的指针加1,直到遇到'\0'递归结束
{
    
                                 
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);//递归每进行一次返回值就加1
}
int main()
{
    
    
	char str[] = "abcdef";
	int len = my_strlen(str);
	printf("%d\n", len);
	return 0;
}

在这里插入图片描述

3、指针-指针的方式

#include <stdio.h>
int my_strlen(char* s)
{
    
    
	char* p = s;//把函数传来的值赋给指针p
	while (*p != '\0')//对指针p进行解引用,如果不为'\0',则依次向后找,直到找到'\0'结束循环
	{
    
    
		p++;
	}
	return p - s;//对指针相加减计算的是中间元素的个数
}
int main()
{
    
    
	char str[] = "abcdef";
	int len = my_strlen(str);
	printf("%d\n", len);
	return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/2301_78373304/article/details/133031441