目录
一、memchr
该函数用来查找数据中的是否存在某个数(直接对字节进行查找)
memchr用法:
- 函数声明:
- 函数的参数:
memchr例子:
int main() { char arr[] = "the memchr"; char* pa = (char*)memchr(arr, 'm', 10);//强制类型转化为char* if (pa == NULL)//检测返回值是否为空指针 printf("not found"); else printf("第一个 %c 是该字符串中第 %d 个",*pa,pa-arr+1); return 0; }
运行结果:
第一个字符 m 是该字符串中第 5 个
该函数只能查找字符吗?
- 因为其参数是void*,所以理论上对任何类型的数据都成立,例如:
int main() { int a = 12345; int* pa = (int*)memchr(&a, 0x30, 4);//a的内存空间中,第二个字节的是30,所以用0x30当特例 if (pa == NULL) printf("not found"); else printf("%d",*pa); return 0; }
运行结果:
-872415184//存在返回值,所以memchr可以作用int型的数据
- 因为数据是以2进制位的形式存储,所以拿数据时值难以计算(可以算出)
由上可知,memchr几乎适用于一切类型,不过一般用来查找字符串中的元素
二、memset
该函数用来在字节层面上修改数据
memset用法:
- 函数声明:
- 函数的参数:
memset例子:
int main() { char arr[] = "this is a the memset"; char* pa = (char*)memset(arr, '-', 3);//从arr开始,往后3个字符改为'-' if (pa == NULL) printf("never gonna happen"); else printf("%s", arr); return 0; }
运行结果:
Before: this is a the memset After: ---s is a the memset
内存改动如下:( 将arr地址开始往后3个字符依次改为 ’ - ‘ )
同样,memset也适用于所有类型数据,因为他和别的mem-型函数一样都是直接对内存进行修改
三、memmove
该函数用来进行字节拷贝,可以自己内部拷贝,重叠部分不影响
memmove用法:
- 函数声明:
- 函数参数
memmove例子:
int main() { char str[] = "this is a test for memmove"; char* ptr = (char*)memmove(str, str + 10, 5); puts(str); return 0; }
运行结果:
Before:this is a test for memmove After: test is a test for memmove
内存变化:
memmove也可以做不同字符串之间的拷贝,但常用于自身内部的操作
四、memcpy
用来拷贝字符串,看似与memmove一样,但memcpy难以实现数组自己内部的重叠部分的拷贝
memcpy用法:
- 函数声明
- 函数参数
memcpy例子:
int main() { char arr1[] = "abcdefg"; char arr2[] = "****"; char* pa = (char*)memcpy(arr2, arr1, 3); puts(arr2); return 0; }
运行结果:
abc*
但是,这个函数一般情况下不能实现自身内部的拷贝(当两个指针内容有重叠部分时)
五、memcmp
用来比较选定字节内数据的大小比较
memcmp用法:
- 函数声明
- 函数参数
memcmp例子 :
int main() { int a = 123456789; int b = 987654321; int ret = memcmp(&a+1, &b, 2); if (ret>0) printf("a>b"); else if (ret<0) printf("a<b"); else if (ret==0) printf("a==b"); return 0; }
运行结果:
a>b
内存如下:
自定义实现
一、memchr
void* my_memchr(const void* dest,char value,int size) { int i = 0; for (i = 0; i < size; i++) { if (*(char*)dest == value) { return dest; } (char*)dest+=1; } return NULL; }
二、memset
void* my_memset(void* dest, char value, int num) { while(num--) { *(char*)dest = value; (char*)dest+=1; } }
三、 memmove
void* my_memmove(void* dest, const void* src, int size) { int i = 0; void* p1; void* p2; if(dest<src) { p1 = dest; p2 = src; for (i = 0; i < size; i++) { *(char*)p1 = *(char*)p2; (char*)p1 += 1; (char*)p2 += 1; } } else { p1 = (char*)dest + size-1; p2 = (char*)src + size-1; for (i = 0; i < size; i++) { *(char*)p1 = *(char*)p2; (char*)p1 -= 1; (char*)p2 -= 1; } } return dest; }
四、memcpy
void* my_memcpy(void*dest,void*src,int size) { void* pa = dest; while (--size) { *(char*)dest = *(char*)src; (char*)dest += 1; (char*)src += 1; } }
五 、memcmp
int my_memcmp(void* p1, void* p2, int size) { while (--size) { if (*(char*)p1 - *(char*)p2 > 0) return 1; else if (*(char*)p1 - *(char*)p2 < 0) return -1; (char*)p1 += 1; (char*)p2 += 1; } return 0; }