函数实现快速预览:
1. memcpy()函数不能拷贝重叠的内存
2. memmove函数可以处理内存重叠的情况
3. strcmp任何类型都可以比较,前提是强制转换成char类型
4. strstr函数中查找src所有字符串是否能在dest中找到
目录
- 一、void* memcpy(void* dest, const void* src, size_t num)
- 二、void* memmove(void* dest, const void* src, size_t num)
- 三、int strcmp(const char*src, const char* dst)
- 四、char* strstr(char* arr1, char* arr2)
一、void* memcpy(void* dest, const void* src, size_t num)
给两个数组arr1和arr2,需要把arr2中的值拷贝到arr1中,占12个字节,多余的4个字节用0来替换,arr1+3代表从arr1数组首地址开始向后跳3个数,也就是从第三个值后开始拷贝。
int arr1[10] = {1,2,3,4,5,6,7,8,9,10};
int arr2[10] = {99,88};
my_memcpy(arr1+3, arr2, 12);
具体实现:
void* memcpy(void* dest, const void* src, size_t num){
assert(dest && src); //dest和src都不为null
void* ret = dest;
while(num--){
*(char*)dest = *(char*)src;
dest = *(char*)dest+1;
src = *(char*)src+1;
}
return ret;
}
我们把dest和src进行了强制类型转换,因为我们不知道用户传的是int类型还是char类型还是其他类型,因此这样一个一个的字节拷贝可以提升函数的通用醒。
二、void* memmove(void* dest, const void* src, size_t num)
memcpy和memmove的最大区别在于后者可以拷贝同一数组中有重叠的内容
举个例子:
//如果有这样一个数组
int arr1[10] = {1,2,3,4,5,6,7,8,9,10};
memcpy(arr1+3, arr1, 20); //结果是1,2,3,1,2,3,1,2,9,10
memmove(arr1+3, arr1, 20); //结果1,2,3,1,2,3,4,5,9,10
memmove函数达到了我们的预期,那么memmove是怎么判断有重叠的部分?让我们分析一下
- case1 :当dest在src的前面,就从前向后拷贝
- case2:当dest在src的后面,就只能从后向前拷贝
void * my_memmove ( void * dst, const void * src, size_t count)
{
void * ret = dst;
if (dst < src) {
/*
从前 向后 拷贝
*/
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
/*
从后向前拷贝
*/
else {
dst = (char *)dst + count - 1;
src = (char *)src + count - 1;
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}
}
return ret ;
}
三、int strcmp(const charsrc, const char dst)
此函数用来比较两个字符串大小。逐个字符去比较大小
返回0 : 字符相等
返回-1:后者更大
返回1:前者更大
int my_strcmp(const char *src, const char * dst){
int ret = 0;
assert(src&&dst);
while(! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst ){
++src;
++dst;
}
if(ret<0){
return -1;
}else if(ret>0){
return 1;
}
return ret;
}
四、char* strstr(char* arr1, char* arr2)
次函数查找src所有字符串是否能在dest中找到,如果找到返回所在的首地址,否则返回null。
char* strstr(char* arr1, char* arr2){
char* cp = arr1;
char* p1 = arr1;
char* p2 =arr2;
while(*cp){
p1 = cp;
p2 = arr2;
while(*p1!='\0' && *p2!='\0' && (*p1==*p2) ){
p1++;
p2++;
}
if(*p2=='\0){
return (char*)cp;
}
cp++;
}
return NULL;
}
创作不易,如果文章对你有帮助的话,老铁们点个赞再走 !