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;
}
相关推荐
stm 学习ing14 分钟前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
Red Red1 小时前
网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务
网络·笔记·学习·安全·web安全
Natural_yz3 小时前
大数据学习17之Spark-Core
大数据·学习·spark
qq_172805593 小时前
RUST学习教程-安装教程
开发语言·学习·rust·安装
一只小小汤圆3 小时前
opencascade源码学习之BRepOffsetAPI包 -BRepOffsetAPI_DraftAngle
c++·学习·opencascade
虾球xz3 小时前
游戏引擎学习第20天
前端·学习·游戏引擎
LateBloomer7773 小时前
FreeRTOS——信号量
笔记·stm32·学习·freertos
legend_jz4 小时前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法
Komorebi.py4 小时前
【Linux】-学习笔记04
linux·笔记·学习
weiabc4 小时前
学习electron
javascript·学习·electron