C语言:模拟实现strncpy、strncat、strncmp、strrchr函数

目录:

strncpy、strncat、strncmp函数与strcpy、strcat、strcmp函数非常相似,实现的功能也差不多。但strncpy、strncat、strncmp函数要比strcpy、strcat、strcmp函数更安全。因为在c语言string库中,strcpy,strcat,strcmp这三个函数是通过自身的长度来终止循环的,在一些条件下很不安全,比如:在strstr函数中,给arr自身后面追加arr,程序就会崩溃。

因此,就又引入了strncpy、strncat、strncmp这几个函数,这几个函数是比strcpy,strcat,strcmp多一个参数,size_t count,该参数表示字节,也就是可以限制拷贝的字节数,并且一般情况下,strncpy、strncat、strncmp这几个函数是以’\0’来终止循环的,这样就避免了程序找不到终止条件,从而崩溃掉的现象。并且strncpy、strncat函数会自动在最终结果的末尾加上’\0’。

strncpy函数
#include <stdio.h>
#include <assert.h>
#include <string.h>

char *my_strncpy(char *dest, char *str, int count)
{
    char *ret = dest;
    assert(dest && str);
    while (count-- && *str)
    {
        *dest++ = *str++;
    }
    while (count >= (int)strlen(str))
    {
        *dest = '\0';
        dest++;
        count--;
    }
    return ret;
}

int main()
{
    char arr1[100] = "asdsadvsvawewefaw";
    char arr2[] = "hello world";
    printf("%s\n", strncpy(arr1, arr2, strlen(arr2)));
    return 0;
}

结果:hello world

strncat函数
    #include <stdio.h>
    #include <assert.h>
    #include <string.h>

    char *my_strncat(char *dest, const char *str, int count)
    {
        char *ret = dest;
        assert(dest && str);
        while (*dest)
        {
            dest++;
        }
        while (count-- && *str)
        {
            *dest++ = *str++;
        }
        *dest = '\0';
        return ret;
    }

    int main()
    {
        char arr1[100] = "abcdef";
        char arr2[] = "ghijk";
        printf("%s\n", my_strncat(arr1, arr2, strlen(arr2)));
        return 0;
    }

结果:abcdefghijk

strncmp
    #include <stdio.h>
    #include <assert.h>
    #include <string.h>

    int my_strncmp(const char *dest, const char *str, int count)
    {
        assert(dest && str);
        while (count--)
        {
            if (*dest == *str)
            {
                dest++;
                str++;
            }
            else
            {
                if (*dest > *str)
                {
                    return 1;
                }
                else
                {
                    return -1;
                }
            }
        }
        return 0;
    }

    int main()
    {
        char arr1[] = "hello";
        char arr2[] = "hello";
        printf("%d\n", my_strncmp(arr1, arr2, strlen(arr1)));
        return 0;
    }

结果:0

strrchr

strchr查找字符串s中首次出现字符c的位置,返回首次出现c的位置的指针
strrchr查找字符串s中最后一次出现字符c的位置,返回最后一次出现c的位置的指针

    #include <stdio.h>
    #include <assert.h>
    #include <string.h>

    char *my_strrchr(char *str, char c)
    {
        char *ret = NULL;
        assert(str);
        int count = strlen(str);
        while (count--)
        {
            if (*(str + count) == c)
            {
                ret = str + count;
                return ret;
            }
        }
        return 0;
    }

    int main()
    {
        char arr1[] = "abbcdefbbdeefg";
        char c = 'b';
        printf("%s\n", my_strrchr(arr1, c));
        return 0;
    }

结果:bdeefg

实际上strncpy、strncat、strncmp函数的代码基本上没变,只是判断条件变了。只有能够知道函数的实现原理,明白函数的功能,在模拟实现的时候才会简单一点

猜你喜欢

转载自blog.csdn.net/aixiaodeshushu/article/details/81347305
今日推荐