前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【strlen】三种方法模拟实现strlen字符串函数

【strlen】三种方法模拟实现strlen字符串函数

作者头像
MicroFrank
发布2023-01-16 12:55:31
3270
发布2023-01-16 12:55:31
举报
文章被收录于专栏:同步文章1234同步文章1234

奇妙的字符串之旅

在这里插入图片描述
在这里插入图片描述

文章目录

  • 模拟实现“求有效字符长度”的函数my_strlen
    • 方法一:计数器法
    • 方法二:函数递归法
    • 方法三:指针相减法

模拟实现“求有效字符长度”的函数my_strlen

由于主函数都一样,现统一给出

代码语言:javascript
复制
int main()
{
char arr[]="abcde";//5个可见(有效)字符
int len=my_strlen(arr);//len接收返回值
printf("%d\n",len);
return 0;
}

方法一:计数器法

代码语言:javascript
复制
int my_strlen(const char*str)
{
 int count=0;
 while(*str++)//先运算后++
  {
  count++;//计数
  }
  return count;
}

备注:此处的函数返回值按照标准理应该size_t也就是unsigned int 返回值为Int 的优缺点: 优点:不会产生由使用size_t(坑坑坑)引发的问题 缺点:不符合size_t类型的返回值的取值范围(数据类型的取值范围)

在这里插入图片描述
在这里插入图片描述

运行结果:

在这里插入图片描述
在这里插入图片描述

const作用:对于不打算修改的变量进行保护,防止被修改。 1.const写给程序员看:自解释,防止后面不小心修改str的值 2.const写给编译器看:一旦修改,立即报错,方便找bug

方法二:函数递归法

递归出口:末尾\0

不了解递归:速戳:递归

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
int my_strlen(const char* str)
{
  if(*str)
  {
  return 1+my_strlen(str+1);
  }
  else
  {
  return 0;
  }
}

方法三:指针相减法

元素个数=(指针1-指针2)/sizeof(数据类型)

代码语言:javascript
复制
int my_strlen(const char* str)
{
	const char* start = str;//把安全(const)的指针交给安全(const)的指针
	while (*str)
	{
		str++;
	}
	return str - start;
}

以上三种方法都可得出结果5

备注:如果方法三为了优化代码而优化代码写成了这样是有问题的

在这里插入图片描述
在这里插入图片描述

解释: while(str++)中把’\0’放在()内在str==‘\0’的时候,跳出循环前还是会进行从左向右执行最后一次的++操作,然后再跳出; 但是 while(*str) { str++; } 把++放在while的代码块{}内,跳出循环是不会再进行从左向右执行最后一次的++操作,而是直接跳出。

举一个例子验证:

在这里插入图片描述
在这里插入图片描述

但是这个问题可以优化到正确的答案:只用在return 返回值处再减去1

备注:我的博客中还有其他字符串函数的相关模拟实现,快来围观吧!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-05-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 模拟实现“求有效字符长度”的函数my_strlen
    • 方法一:计数器法
      • 方法二:函数递归法
        • 方法三:指针相减法
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档