• strlen函数详解及模拟实现


    目录

    一,strlen函数的简介

    二,strlen函数的实现原理

    三,strlen函数的使用 

    🍂场景1 :

    🍂场景2: 

    四,模拟实现strlen函数

    1,计数器的方式

    2,指针 - 指针的方式

    3,递归的方式


    一,strlen函数的简介

    strlen函数是C语言中的一个字符串处理函数,其主要用途是计算一个字符串的长度。它接受一个指向字符串的指针作为参数,并返回一个整数值,表示字符串的长度(不包括空字符'\0')。

    🍂函数原型:  

    size_t strlen ( const char * str );
    • 函数参数为---const char * str:要获取字符串长度的地址。
    • 返回值类型---size_t:无符号整数类型(unsigned int),表示内存中的大小或索引。

    很多小伙伴不太了解size_t类型究竟是什么,下面我们举个例子,大家一看便知:

    1. #include
    2. #include
    3. int main()
    4. {
    5. if (strlen("abc") - strlen("abcdef") > 0)
    6. {
    7. printf(">=\n");
    8. }
    9. else
    10. {
    11. printf("<\n");
    12. }
    13. return 0;
    14. }

    如果从数学的角度去分析的话,strlen("abc")的长度是3,strlen("abcdef")的长度是63-6的结果是-3呀,打印出来的结果就应该是<

    但实际上当我们去运行这个代码的时候会发现打印出来的结果为>=

    为什么是>=呢,就是因为strlen的返回值为无符号整型size_t,而两个无符号数相减得到的还是无符号数,当-3被当作无符号数的时候得到的会是一个非常大的正数,肯定是>0的,所以运行结果就为>=。 

    二,strlen函数的实现原理

    它通过遍历字符串中的每个字符,直到遇到空字符'\0'为止。

    🍂具体步骤: 

    1. 声明一个整形变量count,并初始化为0,用于计数。
    2. 从字符串的第一个字符开始,逐个检查每个字符是否为空字符'\0'
    3. 如果当前的字符不为空字符'\0',则count加1。
    4. 继续检查下一个字符,直到遇到'\0'为止。
    5. 返回count作为字符串的长度。

    三,strlen函数的使用 

    💘使用strlen函数必须添加头文件 #include

    🍂场景1 :

    1. #include
    2. #include
    3. int main()
    4. {
    5. const char* str = "abcdef";
    6. size_t count = strlen(str);
    7. printf("%d\n", count);
    8. return 0;
    9. }

    🎈运行结果: 

    🎈解释:

    这个代码将"abcdef"字符串(字符串是以'\0'为结束标志的)首字符的地址存在str里边,再将str传给strlen,那么strlen遍历到字符'f'时,再向后遍历,就会遇到'\0',此时strlen停止遍历,返回字符个数:6

    🍂场景2: 

    1. #include
    2. #include
    3. int main()
    4. {
    5. char str[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
    6. size_t count = strlen(str);
    7. printf("%d\n", count);
    8. return 0;
    9. }

    🎈运行结果: 

    🎈解释:

    将 'a', 'b', 'c', 'd', 'e', 'f' 六个字符存储到数组str里边,数组只申请了6个空间,并没有存储'\0',所以当strlen遍历到字符'f'时,它后边存储的内容是什么我们并不知道,什么时候遇到'\0'我们也不知道,而strlen函数只有遇到'\0'才会停止,所以返回的数是一个随机值。


     🍂总结:

    strlen函数只能用于计算以空字符'\0'结尾的字符串的长度,如果字符串没有以'\0'结尾,结果将不可预测。

    四,模拟实现strlen函数

    1,计数器的方式

    1. #include
    2. #include
    3. #include
    4. size_t my_strlen(const char* str)
    5. {
    6. assert(str);
    7. size_t count = 0;
    8. while (*str != '\0')
    9. {
    10. count++;
    11. str++;
    12. }
    13. return count;
    14. }
    15. int main()
    16. {
    17. char arr[] = { "abcdef" };
    18. size_t len = my_strlen(arr);
    19. printf("%zd\n", len);
    20. return 0;
    21. }

    2,指针 - 指针的方式

    1. #include
    2. #include
    3. #include
    4. size_t my_strlen(const char* str)
    5. {
    6. assert(str);
    7. char* p = str;
    8. while (*str != '\0')
    9. {
    10. str++;
    11. }
    12. return str - p;
    13. }
    14. int main()
    15. {
    16. char arr[] = { "abcdef" };
    17. size_t len = my_strlen(arr);
    18. printf("%zd\n", len);
    19. return 0;
    20. }

    🎈注:

    相同类型的指针相减,得到的是两个指针之间的元素个数。 

    3,递归的方式

    1. #include
    2. #include
    3. #include
    4. size_t my_strlen(const char* str)
    5. {
    6. assert(str);
    7. if (*str != '\0')
    8. return 1 + my_strlen(str + 1);
    9. else
    10. return 0;
    11. }
    12. int main()
    13. {
    14. char arr[] = { "abcdef" };
    15. size_t len = my_strlen(arr);
    16. printf("%zd\n", len);
    17. return 0;
    18. }
  • 相关阅读:
    Springboot+校园健身互助平台 毕业设计-附源码221540
    Vue 项目中 style 样式中为什么要添加 scoped
    编写一个程序,对输入的任意正整数n,打印出集合{0,1,…,n-1}的所有子集。
    ruoyi-cloud-plus添加一个不要认证的公开新页面
    【JavaEE进阶系列 | 从小白到工程师】Collections工具类的常用方法
    读书笔记:JavaScript DOM 编程艺术(第二版)
    网站数据加密之Hook通用方案
    阿里、腾讯美国员工基本年薪曝光,资深算法工程师24万美元,高级研究员26万美元
    2023年之我拿起“java“ java基础进阶1
    mysql8为什么要开启mysql5中原先的表名称大小写不敏感变成大小写敏感
  • 原文地址:https://blog.csdn.net/weixin_65931202/article/details/133608862