【C语言】字符串相关函数实现

前言

【需求分析 】:C语言中关于字符串的函数有很多,但往往需要的是靠自己去理解,去实现。

  1. 实现函数my_strlen()

【功能描述】 :返回字符串的长度


方法一 :

int my_strlen(const char *str)
{
    int count = 0;
    assert(str);
    while(*str)
    {
      count++;
      str++;
    }
    return count;
}

方法二 :

int my_strlen(const char *str)
{
    assert(str);
    if(*str == '\0');
   {
       return 0;
   }
    else
   {
       return 1+my_strlen(str+1);
   }
}

方法三 :

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

  1. 实现函数my_strcpy()

【功能描述】 :第一个字符串被第二个字符串所覆盖


char *my_strcpy(char *dest, const char *str)
{
    char *temp = dest;
    assert(str);
    assert(dest);
    while(*temp++ = *str++)
    { 
             ;
    }
    return dest;
}

  1. 实现函数my_strncpy()

【功能描述】 :有个数限制字符串复制


char *my_strncpy(char *dest, const char *str,size_t count)
{
    int i = 0;
    char *temp = dest;
    assert(str);
    assert(dest);
    while(count--)
    {  
       if(*str == '\0');
       {
           return NULL;  
       }
       *temp++ = *str++;
    }
    if(*temp != '\0')
    {
         *temp = '\0';
    }
    return dest;
}

  1. 实现函数my_strcat()

【功能描述】 :将第二个字符串链接在第一个字符串后面


char *my_strcat(char *dest, const char *str)
{
    char *temp = dest;
    assert(str);
    assert(dest);
    while(*temp)
    {
        temp++;
    }
    while(*temp++ = *str++)
    {
            ;
    }
    return dest;
}

  1. 实现函数my_strcmp()

【功能描述】 :比较两个字符串大小(比较acsll码值),大于返回大于零的数,小于零返回小于零的数,否则返回零。


int  my_strcmp(const char *str1, const char *str2)
{
    assert(str1);
    assert(str2);
    while(*str1 == *str2)
    {
         if(*str1 == '\0')
         {
            return 0;
         }
         str1++;
         str2++;
    }
    return srt1 - str2;

}

  1. 实现函数my_strstr()

【功能描述】 :看第一个串是否包含第二个串,不包含返回NULL,否则返回 串所在第一个位置


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

    char *s1 = (char *)srt1;
    char *s2 = (char *)str2;
    char *cur = NULL;

    if(*str2 == '\0')
        return (char *)str1;
    while(*s1)
    {
        cur = s1;
        s2 = str2;
        while(*s1 && *s2 && (*s1 == *s2))
        {
            s1++;
            s2++;
        }
        if(*s2 == '\0')
            return s1;
        s1++;
    }
}

  1. 实现函数my_memcpy()

【功能描述】 :将第二个参数按字节复制到第一个字符串(两参数分别在两块独立内存)


void *my-memcpy(void *dest ,const void *str,size_t count)
{
    void * temp = dest;

    assert(dest);
    assert(str);

    //从前到后按字节复制
    while(count--)
    {
        *(char *)temp = *(char *)str;
        temp = (char *)temp + 1;
        str = (char *)str + 1;
    }
    return dest;
} 

  1. 实现函数my_memmove()

【功能描述】 :将第二个参数按字节复制到第一个字符串(内存块可重叠)(字符 数组 整数……都可以复制)


void * memmove(void *dest, const void *str,size_t count)
{
    void * temp = dest;
    assert(dest);
    assert(str);

    if(temp <= str||str >= dest+count)
    {
       while(count--)
       {
        *(char *)temp = *(char *)str;
        temp = (char *)temp + 1;
        str = (char *)str + 1;
       } 
    }
    else
    {
        temp = (char *)temp + count - 1;
        str = (char *)str + count - 1;

        while(count--)
        {
            *(char *)temp = *(char *)str;
            temp = (char *)temp - 1;
            str = (cahr *)str - 1;
        }
    }
    return dest;
}

结语

不负一世韶华,成就七彩人生

猜你喜欢

转载自blog.csdn.net/qq_41035588/article/details/80857145