三种方法模拟实现库函数strlen,加深对strlen的理解

简介: 三种方法模拟实现库函数strlen,加深对strlen的理解

一.对库函数strlen的理解



在cplusplus网站上搜索strlen

2e99ac288f2c4b7eac81d853fb7566e5.png


通过对在网站上对strlen的检索可以知道,strlen以下信息

1.这是一个只负责字符串的库函数!

2.计算的是字符串 \0 之前的长度,不包括\0

3.传入的参数只能是指针

4.返回的类型是size_t类型,本质是unsigned int类型


二.模拟实现库函数strlen



1.计数器法


//1.计数器法
//将字符串的地址传入,找到字符串中每一个不为零的字符并统计
#include<assert.h>
#include<stdio.h>
#include<string.h>
//防止源头字符串被修改,用const修饰
size_t my_strlen(const char* str)
{
  assert(str);//断言传入为非空指针
  int count = 0;//计数器
  while (*str++) //不为零的字符
  {
    count++;
  }
  return count;
}
int main()
{
  char arr[] = "abcdef";
  size_t len=my_strlen(arr);
  printf("%u", len);//由于是模拟strlen,返回类型是size_t,因此用%u打印
  return  0;
}


2.递归法


//2.递归法
 #include<assert.h>
 #include<stdio.h>
size_t my_strlen(const char* str)
{
    assert(str);//断言传入为非空指针
  if (*str == '\0') //控制条件,直到找到了 \0 停止递归
    return 0;
  else  //第一个字符不是\0,长度加 1,并向下找下一个字符
    return 1 + my_strlen(str + 1);
}
int main()
{
  char arr[] = "abcdef";
  size_t len = my_strlen(arr);  //size_t 本质为unsigned int类型
  printf("%u", len);
  return 0;
}


3.指针法


//3.指针相减法
//找到字符串起始位置和\0的位置
//指针与指针相减为中间元素个数
#include<assert.h>
#include<stdio.h>
size_t my_strlen(const char* str)
{
  assert(str);//断言传入的str为非空指针
  char* p = str;//记录起始位置
  //寻找\0得位置
  while (*p)
  {
    p++;
  }
  return p-str;  //指针相减为中间元素得个数
}
int main()
{
  char arr[] = "abcdef";
  size_t len = my_strlen(arr);
  printf("%u", len);
  return 0;
}


三.strlen的一些特殊情况



1.字符串中间添加 \0 相当于截断字符串 \0后面的内容


#include<assert.h>
size_t my_strlen(const char* str)
{
  assert(str);
  char* p = str;//记录起始位置
  //寻找\0得位置
  while (*p)
  {
    p++;
  }
  return p-str;  //指针相减为中间元素得个数
}
#include<stdio.h>
int main()
{
  char arr[] = "abc\0ef";
  size_t len = my_strlen(arr);
  printf("%u", len);
  return 0;
}


运行结果为:


9d42e51421934bcdb58e2a5581430d05.png


相关文章
|
开发工具 git Python
子域名收集 -- OneForAll
子域名收集 -- OneForAll
449 0
|
存储 Kubernetes Cloud Native
【云原生】k8s新版本与Docker和Containerd的关联关系
【云原生】k8s新版本与Docker和Containerd的关联关系
2473 0
|
存储 运维 安全
特权账号管理系统PAM的优势特点
独立的密码保险库设计,保障账号密码存储的安全性,独创的风险检测中心,随时掌握IT环境的风险值,高效的运维管理,提升IT运维系统的主动防御能力,降低企业敏感信息外泄的风险。
383 0
|
JavaScript 前端开发 Java
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题(一)
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题(一) 当前后端分离时,权限问题的处理也和我们传统的处理方式有一点差异。笔者前几天刚好在负责一个项目的权限管理模块,现在权限管理模块已经做完了,我想通过5-6篇文章,来介绍一下项目中遇到的问题以及我的解决方案,希望这个系列能够给小伙伴一些帮助。
2264 0
|
网络架构
网络基础一 交换机 路由器 OSI7层模型
第1章 网络基础 1.1 网络的出现        解决计算机通讯的需求        实现计算机信息可以传递 1.2 主机之间实现通讯基本要求(三要素) ①. 需要在两台主机之间建立物理连接,物理连接的方式有网线 光纤线 wifi 蓝牙,将这些方式统称为介质; ②. 两台主机可以识别数据信息,通过二进制数的方式,利用制定好的协议标准。
1578 0
|
16天前
|
人工智能 自然语言处理 文字识别
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
Qwen3.7-Max是阿里云百炼面向智能体时代推出的新一代旗舰模型,对标GPT-5.5、Claude Opus 4.7等闭源旗舰。该模型支持百万级token上下文窗口,具备顶级推理能力、多模态搜索与视觉理解增强、流式输出低延迟响应等核心优势,覆盖编程、办公、长周期自主执行等复杂场景。同时支持OpenAI接口兼容,便于系统快速迁移。用户可通过Token Plan团队或节省计划等订阅方式灵活调用,适合企业级高要求场景使用。
6019 30
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
|
1天前
|
数据采集 人工智能 前端开发
让 Coding Agent 从黑盒到透明:阿里云 Agent 观测审计数据采集实践
AI Agent 规模化落地带来执行黑盒、行为难追溯、成本难度量三大难题。阿里云基于 OTel 标准,面向 Coding Agent、个人通用助理和框架型 Agent,推出 LoongSuite Pilot、插件及探针等无侵入采集方案,让 Agent 实现可看见、可分析、可审计、可治理。
572 135
|
11天前
|
存储 定位技术 数据库
CodeGraph 如何让 Claude Code减少 7 成工具调用?
CodeGraph 为 Coding Agent 提供本地代码知识图谱,把函数、类、调用链和框架路由提前整理成“项目地图”,减少盲目搜索和文件读取。它不是新 Agent,而是上下文基础设施,让 Agent 更快找到正确代码路径,平均减少 7 成工具调用。
1187 3