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;
}
相关推荐
DKPT5 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
学不动CV了7 小时前
ARM单片机启动流程(二)(详细解析)
c语言·arm开发·stm32·单片机·51单片机
好好研究7 小时前
学习栈和队列的插入和删除操作
数据结构·学习
新中地GIS开发老师8 小时前
新发布:26考研院校和专业大纲
学习·考研·arcgis·大学生·遥感·gis开发·地理信息科学
猫猫的小茶馆9 小时前
【STM32】通用定时器基本原理
c语言·stm32·单片机·嵌入式硬件·mcu·51单片机
SH11HF9 小时前
小菜狗的云计算之旅,学习了解rsync+sersync实现数据实时同步(详细操作步骤)
学习·云计算
Frank学习路上9 小时前
【IOS】XCode创建firstapp并运行(成为IOS开发者)
开发语言·学习·ios·cocoa·xcode
pumpkin8451410 小时前
Rust 调用 C 函数的 FFI
c语言·算法·rust
Chef_Chen11 小时前
从0开始学习计算机视觉--Day07--神经网络
神经网络·学习·计算机视觉
2401_8582861111 小时前
125.【C语言】数据结构之归并排序递归解法
c语言·开发语言·数据结构·算法·排序算法·归并排序