字符串常用函数介绍及模拟实现
创始人
2024-05-12 01:53:58
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原创首发
🌏欢迎各位指出错误,非常感谢~

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...