• C语言每日一题(1):实现库函数strlen()



    • 文章主题:库函数strlen()的实现
    • 所属专栏:C语言每日一题
    • 作者简介:每天不定时更新C语言的小白一枚,记录分享自己每日的所思所想。
    • 个人主页:[₽]的个人主页 

    目录

    前言

    函数介绍

    编程起因

    设计思路

    1.整体逻辑

    2.参数类型

    3.防止空指针

    4.返回值

    代码展示

    结语


    前言

    函数介绍

    strlen()函数是我们在C语言编程中常用到库函数。在C语言中它的头文件是,它的功能是作为一个计数器,从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。

    编程起因

    在VS编译器的定义中我们得知,strlen()函数在该编译器中的返回值为size_t(和类型unsigned int等价,专门用来作为strle()等函数的返回值以及sizeof()操作符的结果类型),参数则为const char*,在知道了这个函数在VS编译器下的定义的情况下,我们是否也能通过函数的功能自己设计出一个strlen()函数呢?


    设计思路

    1.整体逻辑

    根据strlen()函数的定义,函数参数为指针,也就是是数组首元素的地址。我们可以设计一个通过指针解引用后自增进而又解引用的循环结构来实现对数组元素内容的遍历(检测是否为'\0',若碰到'\0',则代表字符数组中储存的第一个'\0'前的字符串中非'\0'的字符已读完,字符串中非零字符的个数已计完),这样的设计从参数本质类型出发,可以简化设计结构(如果是数组下标访问符[]会复杂一些)。

    2.参数类型

    接着参数类型里的const的原理是保护*p,即原字符串中的内容,针对的是设计逻辑的调整,防止设计漏洞导致计算字符个数时直接改变了字符串内容还不报错,因此设计时也需要加入const。

    3.防止空指针

    又因为传递参数为指针,也需要设计防止传NULL的情况,使用断言这个宏可以一边避免NULL的传入,一边又指出程序出错的原因以及报错的位置,传野指针的情况无法避免,一般这种情况也较少,程序会报错或者无法输出。

    4.返回值

    最后,因为不管怎么传哪怕是空指针或者是野指针的情况下函数的返回值都不可能是负数,我们就可以用专门表示这种类型的unsigned int或者是size_t来表示,因为编译器中定义无符号整形时习惯用size_t,所以我们表示的时候也用size_t即可。


    代码展示

    1. #include
    2. #include //储存宏assert的头文件
    3. size_t strlen_P(const char*);//函数strlen_P()的声明(对该函数使用进行声明)
    4. int main()
    5. {
    6. char str[100] = { 0 };
    7. printf("Please enter one sentence:\n");
    8. scanf("%s", str);
    9. printf("The number of words in this sentence is:\n");
    10. printf("%zd", strlen_P(str));
    11. return 0;
    12. }
    13. size_t strlen_P(const char* string)//函数strlen()的定义(对其具体运行逻辑进行定义)
    14. {
    15. assert(string);//防止输入空指针
    16. size_t count = 0;
    17. while (*string++)//碰到'\0'时循环自动跳出,'\0'不参与计数
    18. {
    19. count++;//计字符串中非零字符数
    20. }
    21. return count;
    22. }

    效果呈现


    结语

    自己模仿设计常用库函数既可以加深我们对于该函数运行底层逻辑的理解,又可以锻炼我们的编程思维,提高我们对于各种C语言知识的掌握,是一种很不错的训练方法,作为刚学编程的小白,可能在一些设计逻辑方面有些不足,欢迎评论区进行指正!看都看到这了,点个小小的赞或者关注一下吧(当然三连也可以~),你的支持就是博主更新最大的动力!让我们一起成长,共同进步!

  • 相关阅读:
    Linux 建立链接文件:ln
    在Pytorch中调用RNN模型的小细节
    第一个 Shell 脚本
    【数据分析】2022年北京交通大学计算机学院学术型博士录取数据分析
    天池2023智能驾驶汽车虚拟仿真视频数据理解--baseline
    React报错之组件不能作为JSX组件使用
    (三)linux文件与目录管理
    uniapp2023年微信小程序头像+昵称分别获取
    在Jupyter中使用AI写代码,如有神助,太惊艳了
    阿里云SLB负载均衡&&ESS弹性伸缩
  • 原文地址:https://blog.csdn.net/2303_78612872/article/details/132872799