c---字符串操作的實現(strcmp,strcpy,strstr,strchr,memmove,memcpy)

字符串操作的實現


   這兩天在複習c語言部分,練習了一些有關於字符串的操作題,自己實現strcmp,strcpy,strstr,strchr,memmove,memcpy(後兩個是對內存的操作)


一. strcmp

strcmp是用於比較兩個字符串的大小的。

int strcmp( const char *string1, const char *string2 )
char *string1 = "abcd";
char *string2 = "abfdhjt";

   就像上面兩個字符串,strcmp是從第一個字符開始比較,若是相同,就往後走一個字符,直到找到兩個不同的字符或者有一個字符串已經結束,遇到了 ‘\0’ ,若是碰到了兩個不同的元素,就比較這兩個字符的大小,若是str1>str2,就返回正數,要是str1

int my_strcmp(const char *dst,const char *src)
{
    const char *d = dst;
    const char *s = src;
    while(*s != '\0' && *d != '\0')
    {
        if(*s > *d)
            return -1;
        else if(*d < *s)
            return 1;
        else if(*d == *s)
        {
            d++;
            s++;
        }
    }
    if(*s == '\0'&& *d == '\0')
        return 0;
    else if(*d == '\0')
        return -1;
    else
        return 1;
}
二. strcpy

   strcpy是用來複制字符串的,將源字符串(包括 ‘\0’ )複製到目標字符串中,前提是得保證目標字符串有足夠的空間去接收源字符串。

char *strcpy( char *strDestination, const char *strSource )

char *my_strcpy(char *dst,const char *src)
{
    if(dst == NULL || src == NULL)
        return NULL;
     const char *s = src;
    char *d = dst;
    while(*s != '\0')
    {
        *d = *s;
        d++;s++;
    }
    *d = '\0';
    return dst;
}
三. strstr
char *strstr( const char *string, const char *strCharSet );

   strstr是用於查找字符串當中的字串的,在string中查找是否存在strCharSet字串。若存在則返回在string中出現strCharSet的第一個字符的地址,若在string中不存在strCharSet字串,則返回NULL。

const char *my_strstr(const char *dst, const char *src)
{
    assert(dst);
    assert(src);
    const char *s = src;
    const char *d = dst;
    while(*d != '\0')
    {
        const char *ret;
        ret = d;
        s = src;
        while(*s != '\0' && *s == *d)
        {
            s++;
            d++;
        }
        if(*s == '\0')
            return ret;
        d++;
    }
    return NULL;
}
四. strchr
char *strchr( const char *string, int c )

   strchr是用來查找字符的,在目標字符串中是否有字符ch出現,若找到則返回第一次出現的地址,若沒有找到,則返回NULL。

const char *my_strchr(const char *dst, int c)
{
    if(NULL == dst)
        return NULL;
    const char *d = dst;
    while(*d != '\0')
    {
        if(*d == c)
            return d;
        else 
            d++;
    }
    return NULL;
}

下面兩個就有一點複雜,與string有些不同。他們是對內存進行操作的,以字節爲單位進行復制。他們兩個在某些情況下是有相同的功能的,但是還是有不一樣的地方。memcpy不考慮內存重疊的問題。就像下圖②所示,這兩個字符串有內存重疊的地方,若是不考慮的話,直接從前往後複製的時候,會將後面還沒有複製的地方改變,從而改變了還未進行復制的src串。就會導致拷貝的結果出錯,最後得到的不是預期要的。圖①的情況就適用於從後向前拷貝,所以在複製拷貝時需要判斷是否出現了內存重疊的問題。

五. memcpy
void *memcpy( void *dest, const void *src, size_t count );

   memcpy沒有考慮內存重疊的問題,它就是單純的從前向後拷貝。

void *my_memcpy(void *dst, const void *src,size_t size)
{
    if(dst == NULL || src == NULL)
        return NULL;
    char *d =(char *) dst;
    char *s =(char *) src;
    while(size --)
    {
        *d++ = *s++;
    }
    return dst;
}
六. memmove
void *memmove( void *dest, const void *src, size_t count )

   memmove考慮了內存重疊的問題,進行了判斷,若是src大於dst,就從後向前拷貝,若是src小於dst,就從前向後拷貝。

void *my_memmove(void *dst,const void *src,size_t size)
{
    if(NULL == dst || NULL == src)
        return NULL;
    char *d = (char *)dst;
    const char *s =(char *)src;
    int i = 0;
    if(d < s)
    {
        for(; i < (int)size;i++)
        {
            *d++ = *s++;
        }
    }
    else if(d >= s)
    {
        for(i = (int)size - 1; i >= 0; i--)
        {
            *(d + i) = *(s + i);
        }
    }
    return dst;
}
發佈了65 篇原創文章 · 獲贊 31 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章