strlen函数【详解+模拟实现】


什么是字符串

字符串 - 是程序设计中的表示文本的一种数据类型。
在一般使用的字符串中,分为常量字符串变量字符串
常量字符串 - 即不可被修改的字符串

char*ar1 = "abcdefg";
"sdsdsdsdsd";

该处的两个字符串即为常量字符串 - 不能对值进行修改


char arr[] = "hello world";
char a = 'c';

该处的arr与a即为变量字符串(字符) - 即可对值进行修改
一般来说,C语言本身是没有字符串类型的,且字符串通常放在常量字符串中或者字符数组中


求字符串长度 - strlen函数

在字符串的处理当中,我们经常需要使用到字符串的长度,除了sizeof操作符(返回一个对象或者类型所占的内存字节数)以外,在c语言库函数中,也存在一个可以用来求出字符串长度的函数strlen函数(string.h文件中)。


strlen函数的使用

#include<string.h>//使用字符串函数应该包含<string.h>文件
#include<stdio.h>

void test1()
{
	char arr[] = "abcdef";
	int ret = strlen(arr);
	printf("%d\n", ret);//打印结果为6
}
int main()
{
	test1();
	return 0;
}

若是存在以下代码,该代码的输出是什么?为什么?

void test2()
{
	char arr1[] = "abcd";
	char arr2[] = "abcdefg";
	if (strlen(arr1) - strlen(arr2) < 0) {
		printf("<\n");
	}
	else printf(">\n");
}

当程序运行,我们可以发现结果为:

在这里插入图片描述

为什么结果不为 “<” ???


在这里插入图片描述

从cplusplus网站中可以看出,strlen函数是传入一个char*的指针且返回的是一个size_t的值(无符号)的值
在上面的代码中,arr1的长度为4,arr2的长度为7,相减即为 -3
strlen函数返回的是一个无符号的数,即将 -3 看为一个无符号的数。
-3 :
原码为 1000 0000 0000 0000 0000 0000 0000 0011
反码为 1111 1111 1111 1111 1111 1111 1111 1100
补码为 1111 1111 1111 1111 1111 1111 1111 1101
因为返回值为size_t类型,即将-3的补码当成原码进行计算
故打印为">"


strlen函数的原理

了解到了strlen函数返回的是一个size_of的值,且返回的值为该字符串’\0’之前的字符个数,既然如此,那么这里有一个问题
strlen函数的计算方式是到’\0’为止?
还是字符串个数中只是不包括’\0’的个数?


存在以下代码:
该代码打印出的结果是什么?

void test()
{
char arr[] = "abcd\0efgh\0ijk";
printf("%d\n",strlen(arr));
}

在这里插入图片描述

从打印结果可以大概推断出,strlen函数计数的是’\0’之前出现的字符,当该函数一个个字符查找知道找到’\0’则停止。

strlen函数的模拟实现

李姐到了strlen函数的原理,那是否能根据strlen函数的原理模拟出一个strlen函数?


可以!
根据strlen函数的原理,我们可以思考几种方法:

  1. 计数器:

创建一个变量作为计数器,且遍历字符串;每遍历一个非’\0’时,计数器变量+1;

size_t my_strlen_count(char* p)
{
   size_t count = 0;//创建一个计数器变量
   while (*p++ != '\0') {//遍历整个字符串
   	count++;//每当遇到一个非'\0'的字符则计数器+1
   }
   return count;
}
void test1()
{
   char arr[] = "abcdef";
   int ret = my_strlen_count(arr);
   printf("%d\n", ret);
}
int main()
{
   test1();
   return 0;
}

  1. 递归:

使用递归函数来遍历整个字符串,当不为’\0’则返回1+递归该函数,为’\0’则返回0;

size_t my_strlen_recur(char*p)
{
   if (*p != '\0') {
   	return 1 + my_strlen_recur(p + 1);
   }
   else {
   	return 0;
   }
}
void test2()
{
   char arr[] = "abcdef";
   int ret = my_strlen_recur(arr);
   printf("%d\n", ret);
}
int main()
{
   //test1();
   test2();
   return 0;
}

  1. 地址-地址:

使用地址-地址的方法即为创建一个指针变量,并使该指针遍历整个字符串,直到找到’\0’,再用后面的指针减去前面的指针得到的即为之间字符的个数。

size_t my_strlen_dest_src(char* p)
{
	char* pp = p;
	while (*++pp != '\0') {
		;
	}
	return pp - p;
}
void test3()
{
	char arr[] = "abcdef";
	int ret = my_strlen_dest_src(arr);
	printf("%d\n", ret);
}
int main()
{
	//test1();
	//test2();
	test3();
	return 0;
}
  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Dio夹心小面包

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

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

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

打赏作者

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

抵扣说明:

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

余额充值