strlen、strcpy、strstr、strcmp等字符串函数的模拟实现

2021年09月15日 阅读数:2
这篇文章主要向大家介绍strlen、strcpy、strstr、strcmp等字符串函数的模拟实现,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

strlen的模拟实现c++

  • strlen函的函数数原型为:
    size_t strlen ( const char * str );编程

  • strlen函数返回C字符串str的长度数组

  • 实现:
#include<stdio.h>
#include<assert.h>

//运用循环遍历一遍字符串
size_t my_strlen1(const char *str)
{
    assert(str);

    int count = 0;
    while (*str)
    {
        count++;
        str++;
    }
    return count;
}

//运用递归方法
size_t my_strlen2(const char *str)
{
    assert(str);

    if (*str == '\0')
    {
        return 0;
    }
    else
    {
        return 1 + my_strlen2(str + 1);
    }
}

//运用指针相减得到数组长度
size_t my_strlen3(const char *str)
{
    assert(str);

    char *p = str;
    while (*p != '\0')
    {
        p++;
    }
    return p - str;     //指针相减
}

int main()
{
    char str[] = "abcdefgh";
    printf("strlen1 = %d\n", my_strlen1(str));
    printf("strlen2 = %d\n", my_strlen2(str));
    printf("strlen3 = %d\n", my_strlen3(str));
    system("pause");
    return 0;
}

运行结果:
strlen、strcpy、strstr、strcmp等字符串函数的模拟实现_程序设计markdown

strcpy的模拟实现ide

  • 函数原型:
    char * strcpy ( char * destination, const char * source );函数

  • 函数将源指向的C字符串复制到目标指向的数组中,包括终止空字符。
    source:要复制的C字符串。
    destination:指向要复制内容的目的地数组的指针。ui

  • 实现:
#include<stdio.h>
#include<assert.h>

//strcpy的模拟实现,src:要复制的C字符串;dest:指向要复制内容的目的地数组的指针。
char *my_strcpy(char *dest, const char *src)
{
    char *ret = dest;
    assert(dest);
    assert(src);

    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}

int main()
{
    char dest[10] = { 0 };
    char *d = dest;
    my_strcpy(d, "abcdef");
    printf("%s\n", d);
    system("pause");
    return 0;
}

程序执行结果:
strlen、strcpy、strstr、strcmp等字符串函数的模拟实现_编程开发_02atom

strcat的模拟实现spa

  • 函数原型:
    char * strcat ( char * destination, const char * source );
  • 将源字符串的内容追加到目标字符串中。
  • 实现:
#include<stdio.h>
#include<assert.h>

char *my_strcat(char *dest, const char *src)
{
    char *ret = dest;
    assert(dest);
    assert(src);

    while (*dest)
    {
        dest++;        //判断目标字符串是否到'\0'
    }
    while (*dest++ = *src++)   //将源字符串拷贝给目标字符串
    {
        ;
    }
    return ret;
}

int main()
{
    char dest[20] = "Hello";
    char *d = dest;
    printf("%s\n",d);
    my_strcat(d, " world!");
    printf("%s\n", d);
    system("pause");
    return 0;
}

程序执行结果:
strlen、strcpy、strstr、strcmp等字符串函数的模拟实现_程序设计_03设计

strstr的模拟实现

  • 函数原型:
    const char * strstr ( const char * str1, const char * str2 );
    char * strstr ( char * str1, const char * str2 );

  • 函数返回一个指向在str1中str2第一次出现指针,若是str2不是str1的一部分,则返回空指针。匹配过程不包括终止空字符,但它在那里中止。

  • 实现:

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

const char *my_strstr(const char *str1, const char *str2)
{
    assert(str1);
    assert(str2);

    char *st = (char *)str1;    //保存dest首地址
    char *subst = (char *)str2;
    char *s = NULL;

    if (*str1 == '\0')
    {
        return NULL;
    }

    while (*st)
    {
        s = st;
        while (*s && *subst && (*s == *subst))
        {
            s++;
            subst++;
        }

        if (*subst == '\0')
        {
            return st;
        }
        subst = (char *)str2;
        st++;         
    }
    return NULL;
}

int main()
{
    char str1[] = "Helloworld!";
    char *s1 = str1;
    char str2[] = "wor";
    char *s2 = str2;

    printf("str1 = %s \n", s1);
    printf("str2 = %s \n", s2);
    printf("my_strstr = %s\n", my_strstr(s1, s2));

    system("pause");
    return 0;
}

执行结果:
strlen、strcpy、strstr、strcmp等字符串函数的模拟实现_编程开发_04

strcmp的模拟实现

  • 函数原型:
    int strcmp ( const char * str1, const char * str2 );

  • 将C字符串str1和str2自左向右进行逐个字符比较(按ASCII值大小比较)。比较每一个字符串开始的第一个字符,若是它们彼此相等,则继续向后,直到字符不一样或达到终止空字符为止。

  • 实现:
#include<stdio.h>
#include<assert.h>

int my_strcmp(const char *str1, const char *str2)
{
    assert(str1);
    assert(str2);

    int ret = 0;
    //当str1和str2字符相等时,继续向后比较
    while (!(ret = *(unsigned char*)str1 - *(unsigned char *)str2) && *str2)
    {
        ++str1;
        ++str2;
    }
    //str1 < str2
    if (ret < 0)
    {
        ret = -1;
    }
    //str1 > str2
    else if (ret > 0)
    {
        ret = 1;
    }
    //str1 == str2
    return (ret);
}


int main()
{
    char str1[] = "2468";
    char *s1 = str1;
    char str2[] = "1357";
    char *s2 = str2;
    printf("my_strcmp(2468,1357) = %d\n", my_strcmp(s1,s2));

    printf("my_strcmp(abcd, cdef) = %d\n", my_strcmp("abcd", "cdef"));
    printf("my_strcmp(ABCD, ABCD) = %d\n", my_strcmp("ABCD", "ABCD"));

    system("pause");
    return 0;
}

执行结果为:
strlen、strcpy、strstr、strcmp等字符串函数的模拟实现_编程开发_05

strchr的模拟实现

  • 函数原型:
    const char * strchr ( const char * str, int character );
    char * strchr ( char * str, int character );

  • 查找字符在字符串中第一次出现的位置。返回指向C字符串str中字符第一次出现的指针

  • 实现:
#include<stdio.h>
#include<assert.h>

const char *my_strchr(const char *str, int character)
{
    assert(str);

    while (*str && (*str != (char)character))
    {
        str++;
    }
    if (*str == (char)character)
    {
        return (char *)str;
    }
    return NULL;
}


int main()
{
    char str[] = "abcdefgh";
    char *s = str;
    char *p = my_strchr(s, 'c');
    if (p != NULL)
    {
        printf("在第%d位找到了\n", p - str + 1);
    }
    else
    {
        printf("未找到!\n");
    }

    system("pause");
    return 0;
}


执行结果为:
strlen、strcpy、strstr、strcmp等字符串函数的模拟实现_编程开发_06

strncpy的模拟实现

  • 函数原型:
    char * strncpy ( char * destination, const char * source, size_t num );
  • 把source所指向的字符串中以source地址开始的前n个字节复制到destination所指的数组中,并返回destination。
  • 实现:
#include<stdio.h>
#include<assert.h>

char *my_strncpy(char *destination, const char *source, size_t num)
{
    char *ret = destination;
    assert(destination);
    assert(source);

    while (num && (*destination++ = *source++))
    {
        num--;
    }
    if (num > 0)
    {
        while (--num)
        {
            *destination++ = '\0';
        }
    }
    *destination++ = '\0';
    return ret;
}

int main()
{
    char str[] = "abcdabcde";
    char *s = str;
    char *p = my_strncpy(s, "Hello world!", 7);
    printf("%s\n", p);
    system("pause");
    return 0;
}

执行结果:
strlen、strcpy、strstr、strcmp等字符串函数的模拟实现_编程开发_07

strncat的模拟实现

  • 函数原型:
    char * strncat ( char * destination, const char * source, size_t num );
  • 在字符串的结尾追加n个字符
  • 实现:
#include<stdio.h>
#include<assert.h>

char *my_strncat(char *destination, const char *source, size_t num)
{
    char *ret = destination;
    assert(destination);
    assert(source);

    while (*destination)
    {
        destination++;
    }
    while (num && (*destination++ = *source++))
    {
        num--;
    }
    *destination++ = '\0';
    return ret;
}

int main()
{
    char str[20] = "abcdabcde";
    char *s = str;
    char *p = my_strncat(s, "Hello world!", 5);
    printf("%s\n", p);
    system("pause");
    return 0;
}

执行结果:
strlen、strcpy、strstr、strcmp等字符串函数的模拟实现_编程开发_08

strncmp的模拟实现

  • 函数原型:
    int strncmp ( const char * str1, const char * str2, size_t num );
  • 将C字符串str1的num个字符与C字符串str2的num个字符进行比较。
    若str1与str2的前num个字符相同,则返回0;若s1大于s2,则返回大于0的值;若s1 小于s2,则返回小于0的值。
  • 实现:
#include<stdio.h>
#include<assert.h>

int my_strncmp(const char *str1, const char *str2, size_t num)
{
    assert(str1);
    assert(str2);

    if (num == 0)
    {
        return 0;
    }

    while ((num--) && (*str1 == *str2))      //比较str1和str2中前num个字符的大小
    {
        str1++;
        str2++;

        if (*str1 > *str2)
        {
        return 1;
        }
        else if (*str1 < *str2)
        {
        return -1;
        }

        else if ((*str1 == '\0') && (*str2 != '\0'))
        {
            return -1;
        }
        else if ((*str1 != '\0') && (*str2 == '\0'))
        {
            return 1;
        }
        else if ((*str1 == '\0') && (*str2 == '\0'))
        {
            return 0;
        }
    }
}

int main()
{
    char str1[] = "abcdabcde";
    char *s1 = str1;
    char str2[] = "abcgdsa";
    char *s2 = str2;
    printf("%d\n", my_strncmp(s1, s2, 5));
    system("pause");
    return 0;
}

执行结果:
strlen、strcpy、strstr、strcmp等字符串函数的模拟实现_程序设计_09