ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2021-06-19 18:29:27  阅读:205  来源: 互联网

标签:src strstr memmove dest void char arr1 strcmp dst


函数实现快速预览:
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的前面,就从前向后拷贝
    在这里插入图片描述
  2. 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;
}

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

标签:src,strstr,memmove,dest,void,char,arr1,strcmp,dst
来源: https://blog.csdn.net/sinat_44182212/article/details/118056604

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有