首页 > 其他分享 >部分字符串函数的自定义实现

部分字符串函数的自定义实现

时间:2023-03-12 20:32:44浏览次数:38  
标签:函数 自定义 dest str2 str1 while 字符串

strlen(),strcpy(),strcmp(),strcat(),strstr()等字符串函数是我们经常遇见的字符串函数,这篇文章,就让我们来尝试自定义实现这些函数。

一、

首先是strlen()函数,strlen()函数是用来计算字符串长度的函数,知道遇到'\0'时结束,计算的长度不包括'\0'。

下面是strlen()函数的声明:

部分字符串函数的自定义实现_while循环

下面实例演示了strlen()函数的用法:

部分字符串函数的自定义实现_字符串_02

我们想要自定义实现strlrn()函数,就要对其进行解析,通过strlen()函数的声明我们可以得知,我们需要将一个函数指针传给strlen()函数,然后函数会返回一个无符号整形。我们还知道,strlen()函数会从我们传入的那个指针开始,向后遍历,知道遇见了字符串的结束标志('\0')停止。

接下来我们就开始着手编写函数了。

自定义函数的定义与strlen()函数保持一致,如下:

部分字符串函数的自定义实现_while循环_03

首先定义一个变量count用来记录字符串的长度,我们需要让字符串向后遍历,可以用while循环实现,当遇到‘\0’时停止。‘\0’的ASCII码值为0,我们可以直接把*str++作为while循环的条件,每进行一次循环,count++,当遍历到‘\0’时,*str对应的ASCII值为0,条件为0,则while循环结束。最后我们返回count的值就可以得到字符串的长度。

具体代码如下:

部分字符串函数的自定义实现_while循环_04

用assert()函数来防止传入空指针。

实例演示如下: 

部分字符串函数的自定义实现_自定义函数_05

二、

第二个是strcpy()函数,它的功能是把一个字符串1复制给字符串2,需要注意的是,字符串2要用足够的空间容纳字符串1,否则可能会出现溢出的情况。

下面是strcpy()函数的声明:

部分字符串函数的自定义实现_字符串_06

下面实例演示了strcpy()函数的用法:

部分字符串函数的自定义实现_字符串_07

dest是储存复制内容的目标数组,src是要复制的字符串。strcpy()函数会把src包括'\0'复制给dest。具体实现就是遍历src,每次都把src的值赋给dest,直到遇到‘\0’后结束。

自定义函数代码如下:

部分字符串函数的自定义实现_字符串_08

直接把*dest++=*src++设为while循环的条件可以减少代码量,既能把*dest赋值给*src,而且当把‘\0'赋值给*dest后,*dest++=*src++表达式的结果为0,循环停止,然后返回一个指向修改后的dest的指针即可。

实例演示如下:

部分字符串函数的自定义实现_字符串_09

三、

strcmp()函数是用来比较两个字符串大小的函数,字符串比较大小并不是比较两个字符串的长度而是一个一个比较两个字符串对于的字符的ASCII码值,例如:

部分字符串函数的自定义实现_while循环_10

strcmp()函数会先将str1[0]与str2[0]比较,str1[0]==str2[0],则继续比较str1[1]与str2[1],str1[1]==str2[1],比较str1[2]与str2[2],str1[2]<str2[2],就是str2比较大。

strcmp()函数的声明如下:

部分字符串函数的自定义实现_字符串_11

如果str1大于str2,则返回一个正数,如果str1小于str2,则返回一个负数,如果str等于str2,则返回0。

strcmp()函数实例演示如下:

部分字符串函数的自定义实现_while循环_12

自定义函数代码如下

部分字符串函数的自定义实现_自定义函数_13

在比较两个字符串的元素时,只有发现了不同,才能确定两个字符串的大小,如果当前元素相同,则继续比较下一个元素。我们用while循环来实现,条件是*str1==str2,如果str10&&*str20,这也就意味着直到遍历完两个字符串,两个字符串的元素都相同。这也就意味着两个字符串相等,返回0。如果在while循环中,*str1!=str2,就会跳出循环,返回str1-str2。如果st1>str2,意味着字符串str1大于字符串str2,返回一个正数。如果str1<*str2,意味着字符串str1小于字符串str2,返回一个负数。

实例演示如下:

部分字符串函数的自定义实现_while循环_14

四、

strcat()函数的声明如下:

部分字符串函数的自定义实现_while循环_15

strcat()函数的功能是把src所指向的字符串追加到dest所指向的字符串的结尾。注意,dest所指向的字符串要有足够的空间来容纳追加后的字符串。

strcat()函数实例演示如下:

部分字符串函数的自定义实现_while循环_16

自定义函数代码如下:

部分字符串函数的自定义实现_字符串_17

先通过一个while循环让dest指向字符串的‘\0’,然后再通过一个while循环来实现把src指向的字符串从‘\0’开始复制给dest指向的字符串。

实例演示如下:

部分字符串函数的自定义实现_while循环_18

五、

strstr()函数的声明如下:

部分字符串函数的自定义实现_while循环_19

strstr()函数在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。

strstr()函数实例演示如下:

部分字符串函数的自定义实现_字符串_20

我们可以得知,strstr()函数如果找到了字符串needle则会返回字符串haystack中字符串needle第一次出现的位置,否则返回一个空指针。

自定义函数代码如下:

部分字符串函数的自定义实现_自定义函数_21

我们用cp和s1来指向字符串1,s2来指向字符串2。当*s1==*s2时,也就是两个字符串的对应的元素相同,进入下一个while循环,此时cp不变记录字符串1此时遍历到的地址。s1与继续向后遍历,s2开始遍历。如果遍历到字符串2结束退出第二个while循环,那就代表找到了字符串1中字符串2所在的位置,那就返回cp。如果遍历到字符串1结束或者中途退出while循环,那就代表还没有找到字符串1中字符串2所在的位置,则cp继续向后遍历。在没进入第二个while循环时,s1指向的位置始终与cp相同,并随着cp的变化而变化,而s2则是始终指向字符串2的起始位置。如果到cp遍历完,那就意味着字符串1中并不包含字符串2,此时返回空指针。

实例演示如下:

部分字符串函数的自定义实现_字符串_22






标签:函数,自定义,dest,str2,str1,while,字符串
From: https://blog.51cto.com/u_15855358/6116258

相关文章

  • JavaScript异步编程的深入理解,使用回调函数实现异步编程
    异步编程是指在程序运行时,任务不会按照函数调用的顺序依次执行,而是可以同时执行多个任务。JavaScript异步编程有很多种方式,例如使用回调函数、Promise、async/await等。下面......
  • Oracle相关的函数
    1:时间相关 时间的变化。selectsysdate+1fromdual; //表示当前的时间加1天。selectsysdate+1/24fromdual//加1个小时selectsysdate+1/24/60fromdual;加......
  • 函数
    函数的基本使用:无参函数:就是函数没有参数的函数。有参函数:函数内可以传值的函数。位置参数:函数的参数和调用的值一一对应的就是位置函数。关键字参数:以变量名=变量值的......
  • 手写上下文函数
     bind返回一个新函数,但不执行绑定this和部分参数如是箭头函数,无法改变this,只能改变参数Function.prototype.customBind=function(context,...bindArgs){......
  • java线程池使用小技巧:自定义拒绝策略
    java线程池默认提供了几种拒绝策略:这几个策略都实现了RejectedExecutionHandler,拿DiscardOldestPolicy来说,查看源码:核心代码只有2行:e.getQueue().poll()从列表里弹......
  • linux下的ptrace函数
    Linux下的ptrace函数ptrace系统调用的用途ptrace系统调从名字上看是用于进程跟踪的,它提供了父进程可以观察和控制其子进程执行的能力,并允许父进程检查和替换子进程的内核......
  • Java算法——字符串
    344.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)......
  • cpp 数字和字符串相互转换
     字符串转数字1、系统函数strtofstrtodstrtold转为浮点数,参数类型是char*strtol转为整数,自动判断字符串进制类型,参数char*stoistofstol参数类型string,整数可......
  • MySQL中的函数
    1.函数函数与存储过程一样,也是一组预先编译好的SQL语句的集合,理解为批处理语句。将实现某个功能的一段代码封装起来,只暴露名字,隐藏具体实现过程。函数与存储过程的......
  • [JS JavaScript] 使用CryptoJS库对给定的加密字符串进行解密
    本代码可以使用在Web中,或者其他可以出入密码的场景在需要解密的信息不大的情况下,可以将加密后的信息放入到JS中,在输入密码后,对加密后的信息进行解密在vue中,可以很方便的......