strlen(),strcpy(),strcmp(),strcat(),strstr()等字符串函数是我们经常遇见的字符串函数,这篇文章,就让我们来尝试自定义实现这些函数。
一、
首先是strlen()函数,strlen()函数是用来计算字符串长度的函数,知道遇到'\0'时结束,计算的长度不包括'\0'。
下面是strlen()函数的声明:
下面实例演示了strlen()函数的用法:
我们想要自定义实现strlrn()函数,就要对其进行解析,通过strlen()函数的声明我们可以得知,我们需要将一个函数指针传给strlen()函数,然后函数会返回一个无符号整形。我们还知道,strlen()函数会从我们传入的那个指针开始,向后遍历,知道遇见了字符串的结束标志('\0')停止。
接下来我们就开始着手编写函数了。
自定义函数的定义与strlen()函数保持一致,如下:
首先定义一个变量count用来记录字符串的长度,我们需要让字符串向后遍历,可以用while循环实现,当遇到‘\0’时停止。‘\0’的ASCII码值为0,我们可以直接把*str++作为while循环的条件,每进行一次循环,count++,当遍历到‘\0’时,*str对应的ASCII值为0,条件为0,则while循环结束。最后我们返回count的值就可以得到字符串的长度。
具体代码如下:
用assert()函数来防止传入空指针。
实例演示如下:
二、
第二个是strcpy()函数,它的功能是把一个字符串1复制给字符串2,需要注意的是,字符串2要用足够的空间容纳字符串1,否则可能会出现溢出的情况。
下面是strcpy()函数的声明:
下面实例演示了strcpy()函数的用法:
dest是储存复制内容的目标数组,src是要复制的字符串。strcpy()函数会把src包括'\0'复制给dest。具体实现就是遍历src,每次都把src的值赋给dest,直到遇到‘\0’后结束。
自定义函数代码如下:
直接把*dest++=*src++设为while循环的条件可以减少代码量,既能把*dest赋值给*src,而且当把‘\0'赋值给*dest后,*dest++=*src++表达式的结果为0,循环停止,然后返回一个指向修改后的dest的指针即可。
实例演示如下:
三、
strcmp()函数是用来比较两个字符串大小的函数,字符串比较大小并不是比较两个字符串的长度而是一个一个比较两个字符串对于的字符的ASCII码值,例如:
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()函数的声明如下:
如果str1大于str2,则返回一个正数,如果str1小于str2,则返回一个负数,如果str等于str2,则返回0。
strcmp()函数实例演示如下:
自定义函数代码如下
在比较两个字符串的元素时,只有发现了不同,才能确定两个字符串的大小,如果当前元素相同,则继续比较下一个元素。我们用while循环来实现,条件是*str1==str2,如果str10&&*str20,这也就意味着直到遍历完两个字符串,两个字符串的元素都相同。这也就意味着两个字符串相等,返回0。如果在while循环中,*str1!=str2,就会跳出循环,返回str1-str2。如果st1>str2,意味着字符串str1大于字符串str2,返回一个正数。如果str1<*str2,意味着字符串str1小于字符串str2,返回一个负数。
实例演示如下:
四、
strcat()函数的声明如下:
strcat()函数的功能是把src所指向的字符串追加到dest所指向的字符串的结尾。注意,dest所指向的字符串要有足够的空间来容纳追加后的字符串。
strcat()函数实例演示如下:
自定义函数代码如下:
先通过一个while循环让dest指向字符串的‘\0’,然后再通过一个while循环来实现把src指向的字符串从‘\0’开始复制给dest指向的字符串。
实例演示如下:
五、
strstr()函数的声明如下:
strstr()函数在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。
strstr()函数实例演示如下:
我们可以得知,strstr()函数如果找到了字符串needle则会返回字符串haystack中字符串needle第一次出现的位置,否则返回一个空指针。
自定义函数代码如下:
我们用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,此时返回空指针。
实例演示如下: