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;
}
相关推荐
墨迹的陌离1 小时前
【Linux】重生之从零开始学习运维之Mysql
linux·运维·服务器·数据库·学习·mysql
幻风_huanfeng2 小时前
学习人工智能所需知识体系及路径详解
人工智能·学习
试着2 小时前
零基础学习性能测试第六章:性能难点-Jmeter文件上传场景压测
学习·jmeter·零基础·性能测试
拳里剑气3 小时前
C语言:顺序表(上)
c语言·开发语言·数据结构·学习方法
小一亿3 小时前
【0基础PS】PS工具详解--选择工具--对象选择工具
学习·平面·adobe·信息可视化·传媒·photoshop
Star在努力3 小时前
15-C语言:第15天笔记
c语言·笔记·算法
cyr___3 小时前
Unity教程(二十四)技能系统 投剑技能(中)技能变种实现
学习·游戏·unity·游戏引擎
老虎06274 小时前
JavaWeb(苍穹外卖)--学习笔记14
笔记·学习
典孝赢麻崩乐急4 小时前
Java学习-----JVM的垃圾回收算法
java·jvm·学习
螺丝钉的扭矩一瞬间产生高能蛋白4 小时前
MCU+RTOS调试
c语言·stm32·单片机·嵌入式硬件·嵌入式