C语言strlen函数详解

strlen函数的介绍

strlen函数是C语言中的一个字符串处理函数,用于计算一个字符串的长度,即该字符串中包含的字符数(不包括字符串结尾的’\0’),头文件为<string.h>,基本语法为size_t strlen(const char *str);

strlen函数的使用

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[20] = "hello word";
	printf("%zd", strlen(arr));
	return 0;
}

输出结果
在这里插入图片描述

strlen函数的返回类型为size_t,所以使用%zd输出(%zd为无符号整型)

strlen函数的注意事项

参数指向的字符串必须要以 ‘\0’ 结束
接下来看一串没有\0的代码

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

在这里插入图片描述
字符‘a’,‘b’,‘c’ 三个字符依次存储在arr数组中,并没有存储\0,所以c后面是什么我们并不知道,但是strlen计算的是\0之前的字符数,所以这里返回的是一个随机值。所以我们在使用strlen函数时应检查字符串中是否有\0。

strlen函数的模拟实现

一、计数器的方法
#inlcude<stdio.h>
#include<assert.h>
size_t my_strlen(const char* arr)
{
	int count = 0;
	assert(arr!=NULL);
	//定义一个count变量,计算出arr元素的个数
	//遍历arr数组当*arr不等于\0时count++;
	while (*arr != '\0')
	{
		
		count++;
		arr++;
	}
	//最后将count返回
	return count;
}
int main()
{
	char arr[] = "hello word";
	size_t ret = my_strlen(arr);
	printf("%zd\n", ret);
	return 0;
}

输出结果
在这里插入图片描述
注:assert() 宏接受⼀个表达式作为参数。如果该表达式为真(返回值⾮零), assert() 不会产⽣任何作⽤,程序继续运⾏。如果该表达式为假(返回值为零), assert() 就会报错,在标准错误流 stderr 中写⼊⼀条错误信息,显⽰没有通过的表达式,以及包含这个表达式的⽂件名和⾏号。使⽤ assert() 有⼏个好处:它不仅能⾃动标识⽂件和出问题的⾏号,还有⼀种⽆需更改代码就能开启或关闭 assert() 的机制。如果已经确认程序没有问题,不需要再做断⾔,就在 #include <assert.h> 语句的前⾯,定义⼀个宏 NDEBUG 。

二、地址相减的方法
#inlcude<stdio.h>
#include<assert.h>
size_t my_strlen(const char* arr)
{
	const char* start = arr;
	//将arr的首元素地址存放start中
	assert(arr!=NULL);
	while (*arr != '\0')
	{
		arr++;
	}
	//遍历arr,此时arr的位置来到了\0
	return arr - start;
	//将arr - start的值返回
}
int main()
{
	char arr[] = "hello word";
	size_t ret = my_strlen(arr);
	printf("%zd\n", ret);
	return 0;
}

输出结果
在这里插入图片描述

三、递归的方法
size_t my_strlen(char*arr)
{
	if (*arr != '\0')
	{
		return 1 + my_strlen(arr + 1);
	}
	//当arr!= \0时让1+my_strlen(arr+1),此时arr+1指向'e'的位置,再重复此操作
	else
	{
		return 0;
	}
}
int main()
{
	char arr[] = "hello word";
	size_t ret = my_strlen(arr);
	printf("%zd\n", ret);
	return 0;
}

输出结果
在这里插入图片描述
总结:在使用strlen函数时应注意字符串中有没有包含\0

  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

词观

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值