1、memcmp
①、原形:int memcmp(const void *buffer1, const void ,*buffer2, int count);
②、功能:比较内存区中指定count个字符的大小;
③、代码
#include<stdio.h>
#include<assert.h>
int my_memcmp(const void *buf1,const void *buf2,int n);
int main()
{
int n;
char *buf1 = "hellw";
char *buf2 = "hello";
n = my_memcmp(buf1,buf2,5);
if(n > 0)
{
printf("%s > %s\n ",buf1,buf2);
}
else if(n < 0)
{
printf("%s < %s\n",buf1,buf2);
}
else
{
printf("equal!\n");
}
return 0;
}
int my_memcmp(const void *buf1,const void *buf2,int n)
{
assert(!(buf1 == NULL) && !(buf2 == NULL));
if(!n)
{
return 0;
}
while((--n) && ((*(char *)buf1++) == (*(char *)buf2++)));
return(*((unsigned char *)buf1) - (*(unsigned char *)buf2));
}
2、memcpy
①、原形:void *memcpy(void *dest, const void *src, int count)
②、功能: 从内存中读取src字符串指定count个字符复制到dest中,其中dst与src内存不能重叠
③、代码
#include<stdio.h>
#include<assert.h>
void *my_memcpy(void *dest,const void *src,int count);
int main()
{
char a[100] = "hello";
char b[] = "you";
my_memcpy(a,b,sizeof(b));
//printf("%lu\n",sizeof(b));
puts(a);
return 0;
}
void *my_memcpy(void *dest,const void *src,int count)
{
assert(NULL != dest && NULL != src);
unsigned char*p = (unsigned char *)dest;
unsigned char*q = (unsigned char *)src;
while(count--)
{
*p++ = *q++;
}
*p = '\0';//拷贝完成后不会自动加上'\0'
}
3、memmove
①、原型:void *memmove(void *dst, const void *src, int count)
②、作用:从内存中读取src字符串指定count个字符复制到dst中,其中dst与src内存可以重叠
③、代码
#include<stdio.h>
#include<assert.h>
void *memmv(void *d,const void *s,int count );
int main()
{
//正常mv
char a[100];
char b[] = "hello";
memmv(a,b,5);
puts(a);
putchar(10);
//内存重叠
char c[] = "memmove can be very useful.....";
memmv(c+20,c+15,11);
puts(c);
return 0;
}
void *memmv(void *d,const void *s,int count )
{
//若没有重叠
if((unsigned char *)d >= (unsigned char *)s + count)
{
memcpy(d,s,count);
}
//若重叠,从尾巴开始拷贝
else
{
unsigned char *p = (unsigned char *)d +count;
unsigned char *q = (unsigned char *)s + count;
while(count--)
{
*--p = *--q;
}
}
}
4、memstr
①、原形:void *memchr(const void *buffer, int ch, int count)
②、功能:从buffer所指内存区域的前count个字节查找字符ch, 当第一次遇到字符ch时停止查找
③、代码:
#include<stdio.h>
#include<assert.h>
void *my_memchr(char *buffer,char ch,int count);
int main()
{
char s[] = "hello";
char *p;
char ch = 'e';
p = (char *)my_memchr(s,ch,strlen(s));
if(NULL == p)
{
printf("not find!\n");
}
else
{
printf("in %p\n",p);
}
return 0;
}
void *my_memchr(char *buffer,char ch,int count)
{
while(count-- && (unsigned)ch != *(unsigned *)buffer)
{
buffer = (unsigned char*)buffer+1;
}
return (count ? (void *)buffer : NULL);
}
5、memset
①、原形:void *memset(void *s, int value, size_t num)
②、功能:字符串中的num个字节内容设置为value
③、代码
#include<assert.h>
#include<stdio.h>
void *memset(void *s,int value,size_t num);
int main()
{
int i = 0;
int a[5] = {1,2,3,4,5};
memset(a,0,sizeof(a));
putchar(10);
for(i = 0;i < 5;i++)
{
printf("%-3d",a[i]);
}
return 0;
}
void *memset(void *s,int value,size_t num)
{
assert(s != NULL && num > 0); //断言
char *ptr = (char *)s;
while(num--)
{
*ptr++ = value;
}
}