C语言学习NO.11-字符函数strlen,strlen函数的使用,与三种strlen函数的模拟实现

(一)strlen函数的使用

strlen函数的演示

复制代码
#include <stdio.h>
#include <string.h>

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "good";

	printf("arr1 = %d,arr2 = %d",strlen(arr1),strlen(arr2));
	return 0;
}

(二)strlen使用的注意事项

• 参数指向的字符串必须要以 '\0' 结束。

• strlen的使用需要包含头文件 <string.h>

• 注意函数的返回值为size_t,是无符号的( 易错 )

复制代码
//注意函数的返回值为size_t,是无符号的( 易错 ) 

#include <stdio.h>
#include <string.h>
int main()
{
	const char* str1 = "abcdef";
	const char* str2 = "bbb";
  
	if (strlen(str2) - strlen(str1) > 0)//无符号的两个数相减
	{
		printf("str2>str1\n");
	}
	else
	{
		printf("srt1>str2\n");
	}
	return 0;
}

为何输出的结果与预期的不同?

strlen的返回值类型是无符号型,无符号型-无符号型还是无符号型,因此最后的结果一定是大于0的。

因此在比较两组字符串大小时,我们应采用直接比较的方式

(三)strlen的模拟实现

方式1:使用函数模拟strlen

复制代码
//计数器方式
//使用函数模拟strlen

#include <stdio.h>
#include <assert.h>

int my_strlen(const char* str)
{
	int count = 0;
	assert(str != NULL);//断言  防止str为空指针
	while (*str)
	//while (*str != '\0')
	{
			count++;
			str++;
	}
	return count;
}

int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d", len );

	return 0;
}

方式2:使用递归的方式

复制代码
//不能创建临时变量计数器
//3:使用递归方式
#include <stdio.h>
#include <assert.h>

int my_strlen(const char* str)
{
	//assert(str != NULL);
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str+1);
    //疑问:为什么无法使用str++?
}

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

//疑问:为什么无法使用str++?

答:后置++ 是先使用后自增

所以这里如果这样写 传进去的那个地址值就还是原本的指向

如果用str++ 先使用 后自增 这里的使用表示传参 所以就只会把a的地址传进去 就不符合我们的预期了

这里我们可以调试观察

一、str++的调试结果

在程序进行中,每次进入新阶段前,str的地址发生了改变,但是进入新阶段后,仍是原地址。

二、使用++str的调试结果

str所指向的地址发生了变化。

因此,我们在此处希望由a的地址转换到b的地址,可使用str+1或前置++str的方式。

方式3:指针-指针的方式

复制代码
//使用指针-指针的方式
#include <stdio.h>
#include <assert.h>

int my_strlen(const char* str)
{
	assert(str);
	char *s = str;
	while (*s != '\0')
		s++;
	return s - str;//指针-指针=之间元素的个数
}

int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d", len);
	return 0;
}
相关推荐
网络与设备以及操作系统学习使用者8 分钟前
多路由设备静态路由配置详解
运维·网络·学习·华为·智能路由器
QT-Neal16 分钟前
C/C++ 程序段的概念与分类
c语言·c++
Luminous.38 分钟前
C语言--day25
c语言·开发语言
坏柠1 小时前
从一个设备控制面板开始,系统学习 LVGL 界面开发
android·javascript·学习
创业之路&下一个五年1 小时前
委托、事件、发布-订阅模式全梳理(完整总结)
学习·总结
MartinYeung51 小时前
[论文学习] 全同态加密下的加密文字比较与子字串搜寻演算法延伸研究
学习·区块链·同态加密
Front思1 小时前
如何学习Shopify前端开发?
前端·学习
luj_17681 小时前
硝酸核关联假说缺乏实验证据
c语言·开发语言·c++·经验分享·算法
再玩一会儿看代码1 小时前
Java浅拷贝和深拷贝理解笔记
java·linux·开发语言·笔记·python·学习
我命由我123451 小时前
Excel - Excel 查看当前单元格格式
运维·学习·职场和发展·excel·求职招聘·职场发展·学习方法