字符串常用函数介绍及模拟实现
创始人
2024-05-11 20:45:48
0

🐎作者的话
本文介绍字符串常用的函数如何使用及其模拟实现~


跳跃式目录

    • strlen介绍
    • strcpy介绍
    • strcat介绍
    • strcmp介绍
    • strncpy介绍
    • strncat介绍
    • strncmp介绍
    • strstr介绍
    • strchr介绍
    • strrchr介绍
    • memcpy介绍
    • memmove介绍
    • memcmp介绍
    • memset介绍
    • strtok介绍


strlen介绍

原型:unsigned strlen(const char * str)
用法: 从str开始向后遍历,遇到第一个’\0’后停止,返回从str到此的字符数量,不包含’\0’。
注意事项:

  • 因返回值是unsigned int型,如果将两个strlen的返回值相减,不会得到负数,因此通过正负判断两个字符串哪个更长时,往往会出现BUG。
    如果您不知道为何如此:整型在内存中的存储详解
  • strlen模拟实现:
    法一:循环
    在这里插入图片描述

代码详解: 创建一个变量,每遍历一个字符便让这个变量自增1即可。

法二:递归
在这里插入图片描述

代码详解: 将字符串一点一点蚕食,剩下’\0’时返回0即可。

法三:指针-指针
在这里插入图片描述

代码详解: 指针减去指针所得结果是两个指针之间的元素个数(不是字节个数)。
如果您不知为何如此:指针类型详解

效果图: 返回字符串的长度,仅仅是一个数,在此不在展示。


strcpy介绍

原型:char * strcpy(char * target,const char * source)
用法: 将source的字符串拷贝到target的字符串,包括最后的’\0’。
注意事项:

  • target的空间必须足够大,不然会导致’\0’在target数组之外。
  • target不能是const和char*修饰的常量字符串,因为target需要被修改。
  • strcpy模拟实现:

在这里插入图片描述

代码详解: 遍历,依次覆盖即可。

效果图:

在这里插入图片描述


strcat介绍

原型:char * strcat(char * target,const char * source)
用法: 将从source开始到’\0’结束的字符串接到target的’\0’后面(该’\0’也被替换)。
注意事项:

  • target需要有足够大的空间容纳。
  • target不能是char*和const修饰的常量字符串,因为target需要被修改。
  • strcat模拟实现:

一:普通实现
在这里插入图片描述

代码详解: 先找到target的末尾,随后挨个拼接即可,不要为了’\0’哦。

效果图:

在这里插入图片描述
二:创新实现,自己拼接自己
在这里插入图片描述

代码详解: 利用strlen找到该字符串的末尾,随后拼接即可,注意此时字符串末尾的’\0’已被替换成字符串的第一个字符,所以,末尾的’\0’需要额外赋值。


strcmp介绍

原型:int strcmp(const char * str1,const char * str2)
用法: 将两个字符串从前至后判断,按照ASCII值大小判断,大的被判定为大,有一个字符不同即返回;str1大则返回正数,str2大则返回负数,完全相同则返回0。
注意事项:

  • 在VS中正数返回1,负数返回-1。
  • 因编译器不同,返回值可能也不同,因此,若用strcmp的返回值判断,最好用大于号或小于号,不要直接用1或-1或0。
  • strcmp模拟实现:

在这里插入图片描述

代码详解: 只要str1和str2相同就一直循环,直到二者不同,判断后决定返回什么;若是循环结束,则返回0。

strncpy介绍

原型:char * strncpy(char * target,const char * source,unsigned int n)
用法: 将source开始的n个字符拷贝到target开头的n个字符里。
注意事项:

  • 若n的数值大于source的长度,则多出来的,默认为’\0’,也因此会改变target字符串的结束位置。
  • strncpy模拟实现:

在这里插入图片描述

代码详解: 和strcpy没什么分别,只需要注意循环n次即可。

效果图:

在这里插入图片描述


strncat介绍

原型:char * strncat(char * target,const char * source,unsigned n)
用法: 将source的n个字符,拼接到target的末尾后面。
注意事项:

  • 若n大于source的长度,则多出来的默认接入’\0’,也因此会改变target的结束位置。
  • strncat模拟实现:

在这里插入图片描述

代码详解: 和strcat相同,只需注意循环n次即可。

效果图:

在这里插入图片描述


strncmp介绍

原型:int strncmp(const char * str1,const char * str2,unsigend n)
用法: 对str1和str2的前n个进行比较,按照ASCII值大小。较大的为判断为大;若str1大,则返回正数,若str2大,则返回负数,完全相同默认0。
注意事项:

  • VS中正数默认1,负数默认-1。
  • 不同编译器有所不同,因此不要直接用1或-1判断。
  • strncmp模拟实现:

在这里插入图片描述

代码详解: 和strncmp相同,只是判断前n个,随后的是否相同与此无关。

效果图:

在这里插入图片描述


strstr介绍

原型:char * strstr(const char * arr1, const char * arr2)
用法: 在arr1里面寻找第一个出现的arr2,返回第一次出现的首元素地址。
注意事项:

  • 若arr2长度大于arr1的,则返回null。
  • 若arr2长度大于arr1的,用strcmp或不做任何处理都可以。
  • 作为一个程序员,你应该避免上面两种。
  • strstr模拟实现:

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

代码详解: 先排除特殊情况,先从arr1遍历,找到arr2的第一个字符,然后利用遍历i,不对arr1和arr2自身进行修改,从而判断是否相等;
最需要注意的是arr1和arr2的遍历同时结束,需要额外判断。


strchr介绍

原型:char * strchr(const char * str,char c)
用法: 找到str中第一次出现c的位置,返回地址。

  • strchr模拟实现:

在这里插入图片描述

代码详解: 从str遍历即可,遇到c就返回地址。


strrchr介绍

原型:char * strrchr(const char * str,char c)
用法: 返回str中最后一次出现c的位置。

  • strrchr模拟实现:

在这里插入图片描述

代码详解: 哈哈,从后往前遍历即可。


memcpy介绍

原型:void * memcpy(void * target,const void * source,unsigned n)
用法: 将source开始的n个字节,挨个,以字节为单位,拷贝到target里面。
注意事项:

  • 参数类型是void*,内部会强制转换成char*,因此是以字节为单位拷贝。
  • 自己拷贝自己时,可能会有字节重叠的现象,这时可以用memmove。
  • memmove在VS中是memcpy的上位替代,可以完美替换memcpy,但不同编译器有所不同。
  • memcpy模拟实现:

在这里插入图片描述

代码详解: 创建两个char*的指针,挨字节遍历即可。


memmove介绍

原型:void * memcpy(void * target,const void * source,unsigned n)
用法: memcpy的升级版,可以避免自己拷贝自己时的字节重叠现象。
注意事项:

  • 在VS中memmove是memcpy的上位替代。
  • 但是在VS的标准库中,memcpy一键改的和memmove相同了。
  • 但是如果程序需要你字节重叠,还需要自己写。
  • mommove模拟实现:

在这里插入图片描述

代码详解: 判断了target和source谁在前,谁在后,分两种情况实现代码,避免了重叠问题。


memcmp介绍

原型:int memcmp(const void * data1, const void * data2,unsigned n)
用法: 以字节为单位,挨个比较,data1较大则返回正数,data2较大返回负数,完全相同返回0.

  • memcmp模拟实现:

在这里插入图片描述

代码详解: 创建两个char*指针,挨个字节遍历,遇到不同的字节则返回。


memset介绍

原型:void * memset(void * arr,int c,unsigned n)
用法: 将arr的前n个字节,每个字节设置成c。

  • memset模拟实现:

在这里插入图片描述

代码详解: 挨个遍历,赋值即可。


strtok介绍

原型:char * strtok(const char * str1,const char * str2)
用法: 以arr2的每个字符为标识,将arr1的字符串隔开,返回隔开后的字符段首元素地址;首次调用按函数原型说明传参即可,后续调用须在第一个参数传递NULL,第n次调用返回切割后的第n个字符串首元素地址,详细请看效果图。

  • 因涉及静态区,在此不再展示代码实现。

效果图:
在这里插入图片描述
在这里插入图片描述


📖博客主页:咚咚小圆帽的CSDN主页
🎁感谢您的:👍点赞⭐️收藏❤️关注🔗转发~
📚所属专栏:C语言进阶
📑相关文章: 转义字符类型 详解
🔖今日寄语: 加油~
⚠️本文由咚咚小圆帽于2023年1月14日在CSDN原创首发
🌏欢迎各位指出错误,非常感谢~

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...