天天看點

C語言字元串函數總結:模拟實作常用的字元串類函數(strlen、strcpy、strcmp........)

總結:模拟實作常用的字元串類函數(strlen、strcpy、strcmp……..)

1. strlen

2. strcpy

3. strcat

4. strstr

5. strchr

6. strcmp

7. memcpy

8. memmove

1.strlen有3種方法實作:

a.計數器實作

代碼如下:

#include <stdio.h>
int my_strlen(const char* str)
{
    int count = ;
    while (*str)
    {
        count++;
        str++;
    }
    return count;
}
int main()
{
    int ret = ;
    char* arr = "hello world";
    ret = my_strlen(arr);
    printf("%d\n", ret);
    return ;
}

           

運作結果:

C語言字元串函數總結:模拟實作常用的字元串類函數(strlen、strcpy、strcmp........)

b.遞歸實作

代碼如下:

#include "stdio.h"
int my_strlen(const char* arr)
{
    if (*arr == '\0')
    {
        return ;
    }
    else
    {
        return  + my_strlen(arr + );
    }
}
int main()
{
    int ret = ;
    char* arr = "hello world";
    ret = my_strlen(arr);
    printf("%d\n", ret);
    return ;
}
           

運作結果:

C語言字元串函數總結:模拟實作常用的字元串類函數(strlen、strcpy、strcmp........)

c.指針實作

程式如下:

#include "stdio.h"
int my_strlen( char* arr)
{
    char* p = arr;
    while (*arr)
    {
        arr++;
    }
    return arr - p;
}
int main()
{
    int ret = ;
    char* arr = "hello world";
    ret = my_strlen(arr);
    printf("%d\n", ret);
    return ;
}
           

運作結果:

C語言字元串函數總結:模拟實作常用的字元串類函數(strlen、strcpy、strcmp........)

2.strcpy

代碼如下:

#include <assert.h>
#include <stdio.h>
char* my_strcpy(char* dest, const char*src)
{
    char* ret = dest;
    assert(dest&&src);
    while ((*dest++ = *src++))
    {
        ;
    }
    return ret;
}
int main()
{
    char arr1[] = "abcdef";
    char arr2[];
    my_strcpy(arr2, arr1);
    printf("%s\n", arr2);
    return ;
}
           

運作結果:

C語言字元串函數總結:模拟實作常用的字元串類函數(strlen、strcpy、strcmp........)

3.strcat

代碼如下:

#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* src)
{
    char* ret = dest;
    assert(dest&&src);
    while (*dest)
    {
        dest++;
    }
    while ((*dest++=*src++))
    {
        ;
    }
    return ret;
}
int main()
{
    char arr1[] = "welcome to bite";
    char arr2[] = "my baby ";
    my_strcat(arr2, arr1);
    printf("%s\n", arr2);
    return ;
}
           

運作結果:

C語言字元串函數總結:模拟實作常用的字元串類函數(strlen、strcpy、strcmp........)

4.strstr

代碼如下:

#include<stdio.h>
#include <assert.h>
char* my_strstr(const char* str1, const char* str2)
{
    assert(str2&&str1);
    char* p1 = (char*)str1;
    char* p2 = (char*)str2;
    char *s1 = NULL;
    if (*str2 == '\0')
        return NULL;
    while (*p1)
    {
        s1 = p1;
        p2 = (char*)str2;
        while (*s1&&*p2 && (*s1==*p2))
        {
            s1++;
            p2++;
        }
        if (*p2 == '\0')
        {
            return p1;
        }
        p1++;
    }
    rturn NULL;
}
int main()
{
    char arr1[] = "abbbcdef";
    char arr2[] = "bbcd";
    char* ret=my_strstr(arr1, arr2);
    printf("%s\n", ret);
    return ;
}
           

運作結果:

C語言字元串函數總結:模拟實作常用的字元串類函數(strlen、strcpy、strcmp........)

5.strchr

代碼如下:

#include<stdio.h>
#include <assert.h>
char* my_strchr(const char* dest, char c)
{
    assert(dest!=NULL);
    char* p = (char*)dest;
    if (*p == '\0')
    {
        return NULL;
    }
    while (*p)
    {
        if (*p==c)
        {
            return p;
        }
        p++;
    }
}
int main()
{
    char arr[] = "abcfcfac";
    char c = 'f';
    char* ret = my_strchr(arr, c);
    printf("%s\n", ret);
    return ;
}
           

運作結果:

C語言字元串函數總結:模拟實作常用的字元串類函數(strlen、strcpy、strcmp........)

6.strcmp

代碼如下:

#include<stdio.h>
#include <assert.h>
int my_strcmp(const char* dest, const char* src)
{
    assert(dest&&src);
    while ((*dest == *src) && *dest&&*src)
    {
    if ((*dest=='\0')||(*src=='\0'))
    {
        return ;
    }
        dest++;
        src++;
    }
    if (*dest>*src)
    {
    return ;
    }
    else
    return -;

}
int main()
{
    char arr1[] = "dfgy";
    char arr2[] = "gygyy";
    int ret =my_strcmp(arr1, arr2);
    printf("%d\n", ret);
    return ;
}
           

運作結果:

C語言字元串函數總結:模拟實作常用的字元串類函數(strlen、strcpy、strcmp........)

7.memcpy

記憶體拷貝,和strcpy相比,速度更快。

代碼如下:

#include<stdio.h>
#include <assert.h>
void* my_memcpy(void* dest, const void* src, size_t count)
{
    assert(dest&&src);
    void* ret=dest;
    while (count)
    {
        *(char*)dest = *(char*)src;
        dest = (char*)dest+;
        src = (char*)src + ;
        count--;
    }
    return ret;
}
int main()
{
    char arr1[];
    char arr2[] = "abcdef";
    my_memcpy(arr1, arr2, );
    printf("%s\n", arr1);
    return ;
}
           

運作結果;

C語言字元串函數總結:模拟實作常用的字元串類函數(strlen、strcpy、strcmp........)

memcpy運用中存在的缺陷,即memcpy不能拷貝目的位址(dest)和源位址(src)記憶體空間有重合的部分,更為确切的說應該是當目的位址大于源位址的時候,不能夠有重合部分,否則源位址重合部分資料會發生錯誤。

比如:

#include<stdio.h>
#include <assert.h>
void* my_memcpy(void* dest, const void* src, size_t count)
{
    assert(dest&&src);
    void* ret = dest;
    while (count)
    {
        *(char*)dest = *(char*)src;
        dest = (char*)dest + ;
        src = (char*)src + ;
        count--;
    }
    return ret;
}
int main()
{
    int arr[] = { , , , , , , , , ,  };
    int i = ;
    my_memcpy(arr + , arr + , );
    for (i = ; i < ; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return ;
}
           

運作結果:

C語言字元串函數總結:模拟實作常用的字元串類函數(strlen、strcpy、strcmp........)

顯而易見,當我想把數組1 2 3 4 5 6 7 8 9 10中3 4 5 6拷貝到5 6 7 8的位置時,由于出現重疊,是以拷貝失敗。

8.memmove

他就能完美的解絕memcpy中的缺陷

代碼如下:

#include<stdio.h>
#include <assert.h>
void* my_memmove(void* dest,  void const * src, size_t count)
{
    assert(dest&&src);
    char* p1 = (char*)dest;
    char* p2 = (char*)src;
    if ((p1 > p2) && (p1 < p2 + count))
    {
        while (count--)
        {
            *(p1 +count)= *(p2+count);
        }
    }
    else
    {
        while (count--)
        {
            *p1++ = *p2++;
        }
    }
    return dest;
}
int main()
{
    int arr[] = { , , , , , , , , ,  };
    int i = ;
    my_memmove(arr+, arr+, );
    for (i = ; i < ;i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return ;
}
           

運作結果:

C語言字元串函數總結:模拟實作常用的字元串類函數(strlen、strcpy、strcmp........)

很明顯我成功把3456拷貝到5678的位置。

繼續閱讀