C语言-字符串函数的实现(一)之strlen

C语言中的字符串函数有如下这些

  • 获取字符串长度
  • strlen
  • 长度不受限制的字符串函数
  • strcpy
  • strcat
  • strcmp
  • 长度受限制的字符串函数
  • strncpy
  • strncat
  • strncmp
  • 字符串查找
  • strstr
  • strtok
  • 错误信息报告
  • strerror

接下来看看如何实现它们

获取字符串长度

我们看看文档是怎样说的,如下

size_t strlen ( const char * str );

Get string length
获取字符串长度
Returns the length of the C string str.

返回C字符串str的长度
The length of a C string is determined by the terminating null-character: A C string is as long as the number of characters between the beginning of the string and the terminating null character (without including the terminating null character itself).

C字符串长度是由’\0’来确定的,也就是说从字符串的第一个开始只要遇到’\0’就结束长度计算(不包含’\0’)
This should not be confused with the size of the array that holds the string. For example:
不用困惑你创建的数组的大小,比如这样

char mystr[100]="test string";

defines an array of characters with a size of 100 chars, but the C string with which mystr has been initialized has a length of only 11 characters. Therefore, while sizeof(mystr) evaluates to 100, strlen(mystr) returns 11.

定义一个大小为100的数组 mystr,然后 mystr 就已经被初始化为一个长度为11的字符串了。所以呢, sizeof(mystr) 会得出 100, 而 strlen(mystr) 会返回 11.

综上,可以知道

strlen函数的实现有好几种。

接下来一一实现。

断言指针不为空是个好习惯~

int my_strlen(char* str)
{
    int count = 0;
    assert(str != NULL);
    while (*str != '\0') // while (*str)
    {
        count++;
        str++;
    }
    return count;
}

就一直找’\0’,当*str不是’\0’时,就count++,str++,直到遇到’\0’停止,然后返回count就是长度了。

断言指针不为空是个好习惯~

int my_strlen(char* str)
{
    assert(str != NULL);
    char* p = str;
    while(*p == '\0')
    {
        return 0;
    }
    return 1 + my_strlen(p + 1);
}

比如传入的str地址为 1000

那么 1 + my_strlen(p + 1) 中,p + 1,指针偏移后就是1001,以此类推。

1 + 1 + my_strlen(p + 1)

1 + 1 + 1 + my_strlen(p + 1)

1 + 1 + 1 + 1 + my_strlen(p + 1)

1 + 1 + 1 + 1 + … + 0

最终就可以得出长度。

断言指针不为空是个好习惯~

int my_strlen(char* str)
{
    assert(str != NULL);
    char* p = str;
    while (*p != '\0')
    {
        p++;
    }
    return p - str;
}

把指针str的地址赋值给一个新的指针p,str作为指向起始地址的指针,不改变它,记录起始地址。

然后通过指针p进行查找’\0’,判断当前字符是否为’\0’,不是就进行p++,然后继续判断下一个字符,如此循环,直到指针p找到’\0’,然后用 当前的指针p 减去 起始指针str 进行返回,就是长度了。

最后,谢谢你看到这里,谢谢你认真对待我的努力,希望这篇博客有帮到你

你轻轻一个赞,就是我世界里的一颗星

还有因本人水平有限,如有错误以及不足之处,欢迎 靓仔靓女们指出。

Original: https://www.cnblogs.com/god23bin/p/14669208.html
Author: god23bin
Title: C语言-字符串函数的实现(一)之strlen

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/594654/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Apache Flink系列-④有状态函数

    有状态函数:独立于平台的有状态无服务器堆栈 这是一种在现代基础设施上创建高效、可扩展且一致的应用程序的简单方法,无论规模大小。 有状态函数是一种API,它通过为无服务器架构构建的运…

    Java 2023年6月5日
    055
  • JMeter 测试 ActiveMq

    JMeter 测试 ActiveMq 的资料非常少, 我花了大量的时间才研究出来 关于ActiveMq 的文章请参考我另外的文章。 版本号: ActiveMq 版本号: 5.91 …

    Java 2023年5月29日
    067
  • 集合(模拟斗地主发牌)

    思路:* A:创建一个HashMap集合* B:创建一个ArrayList集合* C:创建花色数组和点数数组* D:从0开始往HashMap里面存储编号,并存储对应的牌* 同时往A…

    Java 2023年6月5日
    055
  • Spring的RestTemplate功能举例

    import com.google.common.collect.Maps; import com.shein.dms.common.BasicCase; import lombo…

    Java 2023年5月30日
    063
  • Nginx总结(九)Nginx服务器高性能优化的配置–轻松实现10万并发访问量

    前面讲了如何配置Nginx虚拟主机,如何配置服务日志等很多基础的内容,大家可以去这里看看nginx系列文章:https://www.cnblogs.com/zhangweizhon…

    Java 2023年5月30日
    064
  • Hyperledger Fabric 2.x 环境搭建

    一、说明 区块链网络的核心是分布式账本,在这个账本中记录了网络中发生的所有交易信息。 Hyperledger Fabric是一个是开源的,企业级的,带权限的分布式账本解决方案的平台…

    Java 2023年6月6日
    099
  • maven bug解决

    [ERROR] Failed to execute goal on project cloud-consumer-feign-order80: Could not resolve …

    Java 2023年6月15日
    0115
  • 注解@Slf4j

    如果不想每次都写private final Logger logger = LoggerFactory.getLogger(XXX.class); 可以用注解@Slf4j 一、在p…

    Java 2023年6月13日
    061
  • MySQL版本引起的错误

    接上一篇帖子,博主在CentOS上安装了最新版的MySQL容器(版本为8.0.19),在使用本地springBoot项目连接,启动项目后操作登录系统时报错。 请看代码: com.m…

    Java 2023年6月7日
    0129
  • 树莓派修改分辨率

    树莓派屏幕分辨率设置 树莓派一般第一次开机会自动给显示屏分配一个最合适的分辨率,但是有时候可能有个别显示屏会不兼容,就需要通过以下方式修改分辨率。而当我们使用VNC远程桌面登录的时…

    Java 2023年5月30日
    096
  • 2 Java内存层面的对象认识

    1 对象的创建 2 对象的内存布局 3 对象的访问定位 3.1句柄访问 3.2 直接指针访问 说明:此分析基于HotSpot虚拟机 1 对象的创建 Java对象的创建方式有三种: …

    Java 2023年6月7日
    084
  • 【Redis】WRONGTYPE Operation against a key holding the wrong kind of value

    此异常的出现情况之一:第一次为 key 设置 value 值是字符串类型,第二次 为 相同 key 设置 value 值的类型不同。 posted @2022-09-28 20:5…

    Java 2023年6月15日
    080
  • change java.io.tmpdir for windows

    win10 最近更新升级了安全策略,禁止从C:\Users\XXX\AppData\Local\Temp\ 下加载dll。 拒绝访问。 直接导致java系的web服务 jna-36…

    Java 2023年5月29日
    0152
  • 数据库系统概论小结(二)【面向考试】

    数据库系统概论小结(二)【面向考试】 第二章 关系数据库 2.1关系数据结构及形式化定义 2.1.1关系 域:一组具有相同数据类型的值的集合。(取值范围) 笛卡尔积:域上的一种集合…

    Java 2023年6月16日
    074
  • 高可用架构(上)

    1. 背景 在学习完各种高性能发实现方案后,就需要对三大复杂度一直的高可用进行开刀了,在高可用方面主要有哪些东西是我们需要考虑的呢?接下来将从三个方面逐一分析。 2. 理论 在设计…

    Java 2023年6月15日
    065
  • 类加载(四):spring-boot-loader 模块

    spring-boot jar包结构 2、 正常情况下,java -jar的类加载器是AppClassLoader 但是spring 使用自定义的URLClassLoader加载我…

    Java 2023年5月30日
    079
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球