シミュレーションはcライブラリ関数strcpy,strcat,strstrstr,strcmp,memcpy,memmoveを実現する

9753 ワード

目次
  • strcpy
  • strcat
  • strstr
  • strcmp
  • memcpy
  • memmove



  • strcpy
    strcpyは文字列レプリケーション関数であり、src(ソース文字列ポインタ)アドレスから始まり'0'終端子を含む文字列をdst(宛先文字列ポインタ)で始まるアドレス空間にレプリケーションする.注意:コピーは、文字列終了識別子'0'とともにコピーされます.文字列のみコピー
    char * My_strcpy(char* dst, const char* src)
    {
    
        char * start = dst;
        assert(dst&&src);
        while (*dst = *src)
        {
            dst++;
            src++;
        }
    
        return start;
    }
    
    int main()
    {
        char arr1[] = "hello";
        char arr2[] = "world";
        My_strcpy(arr1, arr2);
        printf("%s
    "
    , arr1); system("pause"); return 0; }

    strcat
    strcatは文字列接続に使用される関数で、パラメータsrc文字列をパラメータdstが指す文字列の末尾にコピーします.dstの最後の終了文字NULLは上書きされ、接続後の文字列の末尾にNULLが追加されます.注意:dstとsrcが指すメモリ領域はオーバーラップせず、dstはコピーする文字列を収容するのに十分な空間が必要です.
    char* My_strcat(char* dst, const char* src)
    {
        char* start = dst;
        assert(dst&&src);
    
        while (*dst)
        {
            dst++;
        }
        while (*dst = *src)
        {
            dst++;
            src++;
        }
        return start;
    
    }
    
    int main()
    {
        char arr1[] = "hello";
        char arr2[] = "world";
        My_strcat(arr1, arr2);
        printf("%s
    "
    , arr1); system("pause"); return 0; }

    strstr
    strstrは、文字列str 1から文字列str 2関数があるかどうかを検索します.str 2がstr 1のサブストリングである場合、str 1にサブストリングが初めて現れる位置を決定し、この位置のアドレスを返す.サブストリングでない場合はNULLを返します.
    char* My_strstr(char*dst,char*src)
    {
        char *ptr = dst;
        assert(dst&&src);
        while(*ptr)
        {
            char*p1 = ptr;
            char*p2 = src;
            while ((*p1) && (*p2) && (*p1 == *p2))
            {
                p1++;
                p2++;
    
            }
            if (*p2 == '\0')
            {
                return (char*)ptr;
            }
            ptr++;
        }
        return NULL;
    }
    
    int main()
    {
        char arr1[] = "hello world";
        char arr2[] = "world";
        char* ret = My_strstr(arr1,arr2);
        if (ret == NULL)
        {
            printf("  
    "
    ); } else { printf("%s
    "
    , ret); } system("pause"); return 0; }

    strcmp
    strcmpは、2つの文字列s 1とs 2を比較するために使用され、s 1>s 2の場合、1を返す.s 1==s 2、0を返します.
    char* My_strcmp(const char*s1, const char*s2)
    {
        assert(s1&&s2);
        while ((*s1==*s2))
        {
            if (*s1 == '\0')
            {
                return 0;
            }
            s1++;
            s2++;
        }
        if (*s1 > *s2)
        {
            return -1;
        }
        else
        {
            return 1;
        }
    }
    
    int main()
    {
        char arr1[] = "hello world";
        char arr2[] = "world";
        int ret = My_strcmp(arr1, arr2);
        printf("%d
    "
    , ret); system("pause"); return 0; }

    memcpy
    注意!memcpyを使用する場合は、ソースとターゲットのメモリ領域が重複しないことを保証します.機能cとc++で使用するメモリコピー関数.ソースsが指すメモリアドレスの開始位置からnバイトのコピーをターゲットstrが指すメモリアドレスの開始位置に開始するmemcpyとstrcpyは以下の違いがある:1.コピー内容が違います.strcpyは文字列をコピーし、memcpyは文字配列、整数、構造体、クラスなどをコピーします.2.コピー方法が異なる.strcpyはコピーされた文字列の'0'が終了し(オーバーフローする可能性があります)、memcpyは3番目のパラメータによってコピーの長さを決定します.
    void* My_memcpy(void* dst, void* src, size_t n)
    {
        void* start = dst;
        while (n--)
        {
            *(char*)dst = *(char*)src;
            dst = (char*)dst + 1;
            src = (char*)src + 1;
        }
        return start;
    }
    
    int main()
    {
        char arr1[] = "hello";
        char arr2[] = "hi";
        My_memcpy(arr1, arr2, 5);
        printf("%s
    "
    , arr1); system("pause"); return 0; }

    memmove
    memmoveはsrcからcountバイトをdstにコピーするために使用され、ターゲット領域とソース領域が重複している場合、memmoveはソース列が上書きされる前に重複領域のバイトをターゲット領域にコピーすることを保証することができる.ただし、コピーするとsrcの内容が変更されます.ただし、ターゲット領域とソース領域が重複していない場合はmemcpy関数と同様です.
    void* My_memmove(void* dst, const void* src, size_t n)
    {
        char* pdst =(char*) dst;
        char* psrc = (char*)src;
        assert(dst&&src);
        if (pdst <= psrc&& pdst >= psrc + n)//           ;
        {
            while (n--)
            {
                *pdst = *psrc;
            }
        }
        else//             ;
        {
            while (n--)
            {
                *(pdst + n) = *(psrc + n);
            }
        }
        return dst;
    }
    
    int main()
    {
        char arr1[] = "abcdefg";
        char arr2[] = "hijklmn";
        char arr3[10] = { 0 };
        My_memmove(arr3, arr1, 7);
        My_memmove(arr1+2, arr1, 3);
        printf("    :%s
    "
    , arr3); printf(" :%s
    "
    , arr1); system("pause"); return 0; }

    間違いがあればご指摘ください^v^