【C语言进阶】字符串与内存函数memcpy、memmove、strcmp、strstr实现
2021/6/20 7:28:50
本文主要是介绍【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)
- 二、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; }
创作不易,如果文章对你有帮助的话,老铁们点个赞再走 !
这篇关于【C语言进阶】字符串与内存函数memcpy、memmove、strcmp、strstr实现的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享