模拟实现函数strlen

这篇博客介绍了C语言中strlen函数的使用及其重要性,包括统计字符串长度的注意事项。作者通过示例展示了strlen函数在不同字符数组情况下的表现,并提供了三种不同的模拟实现方式:计数法、递归法和地址差法。每种方法都有详细的代码实现,并在main函数中进行了测试。
摘要由CSDN通过智能技术生成

在模拟实现strlen之前,我们先来了解一下strlen如何使用。

strlen实现的功能是统计一个字符串的长度。接受字符串的首元素的地址,统计到\0结束。返回size_t类型的一个无符号整型的数字。

使用的时候有几点需要注意的地方:

①由于c语言中没有字符串这一类型的定义,因此对于字符数组进行统计。

1 对于

 char arr[]={"abcde"};

末尾自带了一个‘\0’,可以正常统计长度。

2 对于

char arr[]={'a','b','c','d','e'};

没有\0因此统计的时候会出现随机值。

3 对于

char arr[10]={'a','b','c','d','e'};

则会自动补上'\0',那么此时使用strlen也能正确的统计出对应的数据。

让我们使用strlen来了解一下。

#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[10] = { "abcde" };//5
	char arr2[] = { 'a','b','c','d','e' };//随机值
	char arr3[10] = { 'a','b','c','d','e' ,'\0' };//5
	printf("%d ", (int)strlen(arr1));
	printf("%d ", (int)strlen(arr2));
	printf("%d ", (int)strlen(arr3));


	return 0;
}

对strlen有了一个基本的了解,那么让我们模拟实现一下strlen吧。

方法一:用count计数

#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* arr1)//为了防止传址调用的时候原字符串被修改 因此加上const对他进行限制
{
	assert(arr1 != NULL);//传入的地址不能是空指针
	unsigned int count = 0;
	while (*arr1 != '\0')
	{
		count++;
		arr1++;//一个位置一个位置进行统计,统计完成之后就++跳到下一个地址。
	}
	return count;

}
int main()
{
	char arr[] = { "abcde" };
	printf("%d ", (int)my_strlen(arr));
	return 0;
}

方法二:函数的递归

#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* arr1)
{
	assert(arr1 != NULL);
	unsigned int count = 0;
	if (*arr1 != '\0')
	{
		return 1 + my_strlen(arr1 + 1);
	}
	
	else
	{
		return 0;
	}
}
int main()
{
	char arr[] = { "abcde" };
	printf("%d ", (int)my_strlen(arr));
	return 0;
}

方法三:地址减去地址(统计元素个数)

#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
#include<assert.h>
size_t my_strlen( const char* arr1)
{
	assert(arr1 != NULL);
	const char* start = arr1;//记录首元素的地址
	while (*arr1!='\0')
	{
		arr1++;
	}
	return arr1 - start;
}
int main()
{
	char arr[] = { "abcde" };
	printf("%d ",(int) my_strlen(arr));
	return 0;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值