前言
在C语言编程中,字符串和内存操作是我们经常需要处理的任务。C标准库提供了一系列高效的字符函数和内存函数来帮助我们完成这些操作。本文将详细介绍这些常用函数的使用方法,并深入探讨它们的模拟实现,帮助大家更好地理解底层原理。
下列函数都是C语言自带的库函数,因此需要引用头文件<string.h>
1.字符函数
1.1 字符串长度函数 - strlen
功能说明
strlen用于计算字符串的长度(不包含结尾的'\0'字符)
格式:
往strlen内传递一个字符串的指针,strlen就会从这个地址开始一个一个沿着字符串往后数,直到遇到\0停止(所数的数字不包含\0本身),随后返回一共所数的数字
使用示例:
注意:因为strlen是到\0就停止,因此如果字符串中插入了\0,就会提前停止
模拟实现:
1.2 字符串复制函数 - strcpy
功能说明
将源字符串复制到目标字符串(包括'\0')
destination为目标字符串的指针,source为原字符串的指针,随后返回被复制的字符串的地址,也就是destination的地址
注意:若是字符串数组,那么目标数组的大小必须大于原字符串的大小。如果复制过程中遇到了\0,那么就会提前停止复制
使用示例:
模拟实现:
变例:strncpy
功能说明:
复制一定长度的字符串
strcpy是把原字符串完全复制过去,而strncpy则是复制一定长度
num就是复制的长度
模拟实现:
1.3 字符串比较函数 - strcmp
功能说明:
比较两个字符串的大小
由于字符往内存所存储的值为ASCII码值,strcmp就是比较两个字符串对应字符的ASCII码值,如果一样继续比较下一个。如果第一个字符串大于就返回大于0的值,如果小于就返回小于0的值,如果完全一样就返回0
使用示例:
两个字符串前3个都为abq,但第四个中d的ASCII码值大于c,那么就判断arr1大于arr2,返回1
模拟实现:
1.4 字符串连接函数 - strcat
功能说明
将源字符串连接到目标字符串末尾
随后返回被复制的字符串的指针
使用示例:
模拟实现:
变例:strncat
功能说明:
strcat是把一个字符串完完整整地复制到另一个字符串末尾,strncat则是指定了复制的长度
num就是指定的长度
模拟实现:
1.5 字符串查找函数 - strstr
功能说明:
在字符串中查找子串
例如到abdef中查找是否含有bdef,如果有就返回首字符(b)的地址,如果没有就返回空指针
使用示例:
模拟实现:
2.内存函数
2.1内存复制函数 - memcpy
功能说明:
复制内存区域的内容
strcpy是复制字符串的函数,而memcpy是复制任意类型的函数
由于memcpy可以复制任意类型的数据,因此必须要用void*来接受任意类型的指针,返回void*的指针。
之前讲过char*是可以以一个字节的单位来访问数据,因此memcpy实际是用char*来访问数据的,在函数内部会将void*指针强制类型转换为char*,而num就是复制的字节大小
使用示例:
模拟实现:
2.2. 安全内存移动函数 - memmove
如果是在数组内复制又如何实现?
如果我们死板用指针+1来复制数据,本来要把8替换为5,但会发现数组中5提前被复制成了2,导致8被替换成了2
但发现如果倒着复制就不会出现问题
也就是从5到2地复制,而不是从2到5复制
如果继续研究就会发现当被复制的地址大于复制的地址,就可以倒着复制;如果被复制的地址小于复制的地址,就可以正着复制
模拟实现:
2.3 内存设值函数 - memset
功能说明:
memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容
value为设置的值,num为被设置的字节个数
使用示例:
由于是按字节来复制,因此int类型的4个字节每个都被复制成了1,而不是每个整型被赋值成了1
模拟实现:
2.4 内存比较函数 - memcpy
strcpy是比较字符串大小,而memcpy可以比较任意类型的大小
使用示例:
模拟实现: