mem系列函数源码实现

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;
    }

}

猜你喜欢

转载自blog.csdn.net/z_ryan/article/details/79250016