【C语言进阶】字符串与内存函数memcpy、memmove、strcmp、strstr实现

函数实现快速预览:
1. memcpy()函数不能拷贝重叠的内存
2. memmove函数可以处理内存重叠的情况
3. strcmp任何类型都可以比较,前提是强制转换成char类型
4. strstr函数中查找src所有字符串是否能在dest中找到

目录

一、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是怎么判断有重叠的部分?让我们分析一下

  1. case1 :当dest在src的前面,就从前向后拷贝
    【C语言进阶】字符串与内存函数memcpy、memmove、strcmp、strstr实现
  2. case2:当dest在src的后面,就只能从后向前拷贝
    【C语言进阶】字符串与内存函数memcpy、memmove、strcmp、strstr实现
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;
}

创作不易,如果文章对你有帮助的话,老铁们点个赞再走 !

上一篇:time,atoi,strstr


下一篇:php给mongodb添加索引