1. 程式人生 > >【c語言】利用指標模式實現字串函式(strlen、strcat、strstr、strcpy、strcmp、memcpy、memove)

【c語言】利用指標模式實現字串函式(strlen、strcat、strstr、strcpy、strcmp、memcpy、memove)

模擬實現strlen

int my_strlen(const char  *p)
{
    assert(p != NULL);
    char *s = p;
    while (*p)
    {
        p++;
    }
    return  p - s;
}

模擬實現strcpy

void   my_strcpy(char*  dst, const  char *src)
{
    assert(dst != NULL);
    assert(src != NULL);
    char *p = dst;
    while (*src)
    {
        *dst = *src;
        dst++;
        src++;
    }
    return
p; }

可簡化如下所示

void   my_strcpy(char*  dst, const  char *src)
{
    assert(dst != NULL);
    assert(src != NULL);
    char *p = dst;
    while (*dst++ = *src++)
    {
        ;
    }
    return  p;
}

模擬實現stract

char * my_stract(char *dst, const char *src)
{
    char *ret = dst;
    assert(dst != NULL);
    assert
(src != NULL); while (*dst) { dst++; } while (*dst++ = *src++) { ; } return ret; }

模擬實現strcmp

int  my_strcmp(const  char *dst, const char *src)
{
    assert(dst != NULL);
    assert(src != NULL);


    while (*dst == *src)
    {
        if (*dst == '\0'
) return 0; dst++; src++; } return *dst - *src; }

模擬實現strstr

char *my_strstr(const  char *str1, const  char*str2)
{
    assert(str1 != NULL);
    assert(str2 != NULL);
    char  *s1;
    char  *s2;
    char  *cur = str1;
    while (*cur)
    {
        s1 = cur;
        s2 = str2;
        while (&s1&&*s2&&*s1 == *s2)
        {
            s1++;
            s2++;
        }
        if (*s2 == '\0')
        {
            return  cur;
        }
        cur++;
    }
}

模擬實現memcpy

void  my_memmove(void* dst, const void* src, size_t count)
{

    assert(dst != NULL);
    assert(src != NULL);
    void * ret = dst;
    if(dst < src)
        while (count--)
       {
            *(char *)dst = *(char *)src;
            dst = (char *)dst + 1;
            src = (char *)src + 1;
        }
    else
    {
        dst = (char*)dst + count - 1;
        src = (char*)src + count - 1;
        while (count--)
        {
            *(char *)dst = *(char *)src;
            dst = (char *)dst - 1;
            src = (char *)src - 1;
        }
    }
}

模擬實現memcpy

void * my_memcpy(void *dst, void * src,size_t count)
{
    /* assert(dst != NULL);*/
void * ret = dst;
    while (count--)
    {
        *(char *)dst = *(char *)src;
        dst = (char*)dst + 1;
        src = (char*)src + 1;
    }
return ret;
}
int  main()
{
    int   arr1[10] = { 0 };
    int   arr2[] = { 1, 2, 3, 4, 5 };
    my_memcpy(arr1, arr2, 12);
    system("pause");
}