本文将围绕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类库函数的介绍就结束了,了解这些库函数的用法和模拟实现,可以提升我们的编程效率,锻炼我们的编程思维,喜欢这篇文章或者觉得有收获的读者可以多多支持下哈,你们的鼓励就是作者更新的动力!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐