天天看點

mem函數源碼

mem函數源碼

1.memcpy函數

  1. 原型:

    void *memcpy(void *dest, const void *src, int count)

  2. 作用:由src指定記憶體區域拷貝count個字元到dest所指定的記憶體區域。
  3. 代碼:
void *my_memcpy(void *dest, const void *src, int count)
{
    /*由src指定記憶體區域拷貝count個字元到dest所指定的記憶體區域。
    src和dest記憶體區域不能重疊,函數傳回指向dest的指針。*/
    //拷貝完成不會自動加上'\0'
    unsigned char *p = (unsigned char *)dest;
    unsigned char *q = (unsigned char *)src;
    while(count--)
    {
        *p++ = *q++;
    }
    return dest;
}

int main()
{
    char a[];
    char *p;
    p = (char *)my_memcpy(a, "hello world!", );
    *(p+) = '\0';  //為puts做準備
    puts(a);
    return ;
}
           

2.memccpy函數

  1. 原型:

    void *memccpy(void *dest, const void *src, char ch, int count)

  2. 作用:如果src前n個位元組中存在’ch’,傳回指向字元’ch’後的第一個字元的指針;

    傳回NULL,并且複制src。

  3. 代碼:
#include <string.h>

void *my_memccpy(void *dest, const void *src, char ch, int count)
{
    /*如果src前n個位元組中存在’ch’,傳回指向字元’ch’後的第一個字元的指針;
    傳回NULL,并且複制src。
    一個條件達到就結束*/
    //對于數字字元,遇見空格則停止,并傳回指向空格的指針

    while(count--)
    {
        *(char *)dest = *(char *)src;
        dest = (char *)dest + ;
        if(*(char *)src == (char)ch)
            break;
        src = (char *)src + ;
    }
    return (count ? (char *)dest : NULL);
}

int main()
{
    char a[];
    char *p;
    char *str ="hello world!";
    char ch;

    ch = '9';
    p = (char *)my_memccpy(a, str, ch, strlen(str)+);
    if(p == NULL)
        printf("Can't not find character.\n");
    else
    {
        printf("Find the character! \n");
        *p= '\0';  //為下面的puts函數準備
    }
    printf("The String which has been copied is:  ");
    puts(a);  //puts()從string的開頭往stdout中輸出字元,直到遇見結束标志 '\0','\0'不會被輸出到stdout。

    printf("************************************");

    ch = 'b';
    p = (char *)my_memccpy(a, str, ch, strlen(str)+);
    if(p == NULL)
        printf("Can't not find character.\n");
    else
    {
        printf("\nFind the character! \n");
        *p = '\0';
    }
    printf("The String which has been copied is:  ");
    puts(a);
    return ;
}
           

3.memmove函數

  1. 原型:

    void *memmove(void *dest, const void *src, int count)

  2. 作用:由src所指定的記憶體區域指派count個字元到dest所指定的記憶體區域。

    src和dest所指記憶體區域可以重疊

  3. 代碼:
#include <string.h>

void * my_memmove(void *dest, const void *src, int count)
{
    /*由src所指定的記憶體區域指派count個字元到dest所指定的記憶體區域。
    src和dest所指記憶體區域可以重疊,
    但複制後src的内容會被更改,最終函數傳回指向dest的指針。*/
    //可以自己考慮count的大小,大于0,小于src的大小

    if((unsigned char *)dest >= ((unsigned char *)src + count))
    {
        /*若果沒有重疊*/
        dest = memcpy (dest, src, count);
    }
    else
    {
        /*如果有重疊,則從尾部進行拷貝*/
        unsigned char *p = (unsigned char *)dest + count;
        unsigned char *q = (unsigned char *)src + count;
        while (count--)
        {
            *--p = *--q;
        }
    }
    return dest;
}

int main()
{
    /*正常的複制*/
    char a[];
    puts((char *)my_memmove(a, "hello world!", ));

    /*記憶體重疊*/
    char str[] = "memmove can be very useful......";
    my_memmove (str+, str+, );
    puts (str);
    return ;
}
           

4.memcmp函數

  1. 原型:

    int memcmp(const void *buffer1, const void *buffer2, int count)

  2. 作用:比較記憶體區域buffer1和buffer2的前count個位元組。
  3. 代碼:
int my_memcmp(const void *buffer1, const void *buffer2, int count)
{
    /*比較記憶體區域buffer1和buffer2的前count個位元組。
    當buffer1 < buffer2時,傳回值 < 0;
    當buffer1 = buffer2時,傳回值 0;
    當buffer1 > buffer2時,傳回值 > 0。*/

    if(!count)
        return ;
    while(--count && *(char *)buffer1 == *(char *)buffer2)
    {
        //判斷前count個字元是否相等
        buffer1 = (char *)buffer1 + ;
        buffer2 = (char *)buffer2 + ;
    }
    //傳回兩個字元串的首個字元的內插補點
    return ( *((unsigned char *)buffer1) - *((unsigned char *)buffer2) );
}

int main()
{
    char *str1 = "hello";
    char *str2 = "world";
    int n = ;
    scanf("%d", &n);

    int res = my_memcmp(str1, str2, n);
    if(res > )
        printf("%s Upper Than %s\n", str1, str2);
    else if(res < )
        printf("%s Lower Than %s\n", str1, str2);
    else
        printf("%s Equal %s\n", str1, str2);

    return ;
}
           

5.memchr函數

  1. 原型:

    void *memchr(const void *buffer, int ch, int count)

  2. 作用:從buffer所指記憶體區域的前count個位元組查找字元ch,

    當第一次遇到字元ch時停止查找。

  3. 代碼:
#include <string.h>

void * my_memchr(const void *buffer, int ch, int count)
{
    /*從buffer所指記憶體區域的前count個位元組查找字元ch,
    當第一次遇到字元ch時停止查找。
    如果成功,傳回指向字元ch的指針,否則傳回NULL*/
    //對于數字字元,遇見空格則停止,并傳回指向空格的指針

    while(count-- && (unsigned char)ch != *(unsigned char *)buffer)
    {
        buffer = (unsigned char *)buffer + ;
    }
    return(count ? (void *)buffer : NULL);
}

int main()
{
    char *str = "hello world!";
    char *p;
    char ch;

    ch = '1';
    p = (char *)my_memchr(str, ch, strlen(str)+);
    if(p == NULL)
        printf("Can't find the character %c !\n", ch);
    else
        printf("Find the character %c !\n", *p);

    ch = 'd';
    p = (char *)my_memchr(str ,ch, strlen(str)+);
    if(p == NULL)
        printf("Can't find the character %c !\n", ch);
    else
        printf("Find the character %c !\n", *p);

    return ;
}
           

參考文章

連結:

http://www.cnblogs.com/jiangyinglin/p/3247087.html