str、mem类库函数——相关用法与模拟实现
本文介绍了str和mem类库函数的使用及模拟实现。str类函数包括strlen、strcpy/strncpy、strcat/strncat、strcmp/strncmp、strstr等字符串操作函数,详细说明了各函数的用途、调用格式及编程模拟实现方法。mem类函数重点介绍了memcpy和memmove两个内存操作函数,特别说明memmove能处理内存重叠情况。通过学习和模拟实现这些常用库函数,可以
本文将围绕str,mem的相关库函数展开进行介绍,主要介绍其用法以及如何通过编程模拟实现这些库函数。每个库函数都有其强大的功能,通过了解它们的用法,可以大大提升我们的编程效率,通过编程模拟实现这些库函数,可以培养我们的编程思维,提升编程能力,加深对这些库函数的理解与运用,为未来的编程打下坚实的基础。
一、str类库函数
str类库函数的使用都需包含一个头文件,<string.h>
(1)strlen函数
用法:用于求字符串长度,统计字符串'\0'之前的字符个数,遇到’\0‘停止统计。
格式:strlen(字符串)

本例中利用strlen函数求字符串“abcdef”的长度,strlen函数返回为size_t,为无符号类型,用len接收返回值,打印形式为%zd,'\0'之前有abcdef总共6个字符,故strlen函数所求结果为6。
模拟实现:

可以利用函数递归思想来实现strlen函数,函数的返回类型为size_t,函数参数为char类型的指针str,用const修饰,保证其有效性,当str读取内容为‘\0’时,返回0,else,则返回1加str向后读一位的字符串长度,这里利用了递归思想求字符串长度,从而模拟实现了strlen函数。
(2)strcpy类函数
strcpy类有两种,strcpy函数与strncpy函数,都用于字符串的拷贝,后者相比前者不同在于后者限制了拷贝的最大长度n。
strcpy函数
用法:用于字符串的拷贝
格式:strcpy(目标字符串,拷贝字符串);
arr1为目标字符,arr2为要拷贝的字符,strcpy拷贝完成后并不会自动在arr1后加上‘\0’,这是strcpy函数的一大特点。

如上图所示,利用strcpy函数实现将arr1字符串拷贝到arr2中。
strcpy函数的模拟实现:

函数的返回值为目标字符串的起始地址,返回类型char*,参数为两个字符指针,s1指向要拷贝目标字符串起始地址,s2指向拷贝字符串的起始地址,assert保证两个指针的有效性,const修饰s2,保证s2不会被修改,循环开始前先将返回地址传给ret保存,while循环实现将s2字符串的内容拷贝到s1中,s2读取到\0停止读数,最后返回目标字符串的起始地址,从而模拟实现了strcpy函数。
strncpy函数
用法:与strcpy函数类似,也是用于拷贝字符串,不同的是,strncpy函数限制了拷贝的最大长度n,当n小于拷贝字符串的长度,strncpy函数不会在目标字符串末尾加上‘\0',当n大于拷贝字符串的长度时,strncpy函数会在目标字符串末尾加上’\0‘,直到满足要拷贝的长度n才停止。
格式:strncpy(目标字符串,拷贝字符串,拷贝的最大长度)

如上图,利用strncpy函数从arr1中拷贝3个字符abc到arr2中,则arr2的结果为abc。
模拟实现:

函数返回值为目标字符串的起始地址,为char*类型,参数与strcpy函数相似,但多了一个无符号参数n,类型为size_t,n为拷贝的最大长度,assert保证s1,s2的有效性,ret用于保存目标字符串的起始地址,便于返回,while循环条件为n>0且s2读取的内容不为\0,第二个while循环表示若n过大,s2已经读取完,则剩下用\0补充,直到n为0结束循环,返回目标字符串的首地址。
(3)strcat类函数
strcat类函数同样也有两种,strcat函数与strncat函数,用于字符串拼接,后者与前者不同之处是后者限制了所拼接的最大长度n。
strcat函数
用法:用于字符串拼接,拼接完成后会在目标字符串结尾加上\0。
格式:strcat(目标字符串,拼接字符串)

如图,通过strcat函数实现了两个字符串的拼接,将arr1与arr2连接起来,拼接完成后,arr1的内容变为hello world。
模拟实现:

与之前的strcpy函数类似,返回类型与函数参数和strcat函数一致,assert保证s1和s2的有效性,ret用于保存目标字符串的起始地址,便于返回,第一个while循环将s1移动至目标字符串的末尾,第二个while循环实现两个字符串的拼接,最后返回ret。
strncat函数
用法:与strcat一致,不同在于strncat函数限制了拼接的最大长度n。
格式:strncat(目标字符串,拼接字符串,拼接的最大长度)

如上图,通过strncat函数实现了arr1和arr2前3个字符的拼接,拼接完成后arr1的内容为hello wor。
模拟实现:

函数返回类型与参数和strncpy函数类似,assert保证s1和s2的有效性,ret用于保存目标字符串s1的起始地址,便于返回,第一个while循环将s1移动到目标字符串末尾,第二个while循环实现两个字符串的拼接,最后将s1指向的内容变为\0,然后返回ret。
(4)strcmp类函数
strcmp类函数有两种,strcmp函数与strncmp函数,均用于字符串的比较,后者与前者不同在于后者限制了比较的最大长度。
strcmp函数
用法:用于字符串比较,相等返回0,大于返回正数,小于则返回负数
格式:strcmp(字符串1,字符串2)

如上图,通过strcmp函数实现了arr1,arr2两个字符串的比较,arr1明显小于arr2,故返回值为-1。
模拟实现:

函数返回类型为整形,参数为两个char类型的指针,指向要比较的两个字符串,const修饰保证不会被修改,assert保证两个指针的有效性,while循环用于两个字符串的比较,返回值为str1与str2指向内容之差,相等,则返回0,大于返回正数,小于返回负数。
strncmp函数
用法:与strcmp函数类似,n限制了要比较的最大长度。
格式:strncmp(字符串1,字符串2,比较的最大长度)

如上图,strncmp只比较arr1与arr2前两个字符ab,相等故返回0。
模拟实现:
+
函数返回类型为整形,参数与strncat类似,while循环比较两个字符串,相等返回0,不相等返回两者的差。
(5)strstr函数
用法:用于判断两个字符串,其中一个字符串是否为另一个的子串。
格式:strstr(字符串1,字符串2)

如图,p为arr1的子串,strstr返回该子串在arr1第一次出现的地址,并读取。
模拟实现:


函数的返回值为char*类型,参数为两个字符指针,用const修饰,保证其不被修改,p1指向字符串1的首地址,传给cur指针,while循环用于判断两个字符串是否为子串,返回值为cur最终指向的位置。
二、mem类函数
使用mem类库函数也需包含头文件<stdio.h>
mem类函数主要用于内存的操作,以字节为单位,我们介绍比较常用的两个函数,memcpy函数与memmove函数。
1.memcpy函数
用法:用于内存数据的拷贝,以字节为单位。
格式:memcpy(字符串1,字符串2,字节数)

如上图,使用memcpy函数将arr1的20个字节数据拷贝到arr2中,也就是5个整形数据,1,2,3,4,5,则arr2前5个元素的内容变为1,2,3,4,5,其余还是为0。
模拟实现:

函数返回类型和参数类型均为void*,assert保证参数的有效性,ret保存函数的返回地址,while循环用于拷贝,以字节为单位,所以将dest和src强制类型转化为char*指针,最后返回ret。
2.memmove函数
用法:memmove函数与memcpy函数类似,都用于内存的拷贝,memmove函数可以处理内存块重叠情况的拷贝。
格式:memmove(字符串1,字符串2,字节数)

如上图,memmove函数处理两个内存块重叠的情况,实现将3,4,5,6,7改为1,2,3,4,5,arr的内容变为1,2,1,2,3,4,5,8,9,10。
模拟实现:

memmove函数返回类型与参数和memcpy函数相似,assert保证参数的有效性,ret用于保存目标字符串的起始地址,当dest<src时,将字节内容从前向后拷贝,dest>src时,字节内容从后向前拷贝,以字节为单位,因此需要强制类型转化为char*指针,最后返回ret。
到此,有关str,mem类库函数的介绍就结束了,了解这些库函数的用法和模拟实现,可以提升我们的编程效率,锻炼我们的编程思维,喜欢这篇文章或者觉得有收获的读者可以多多支持下哈,你们的鼓励就是作者更新的动力!
更多推荐


所有评论(0)