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

1.模拟实现strlen

//三种方法实现
#include <stdio.h>
#include <windows.h>
#include <assert.h>

//递归
int my_strlen1(const char *str)
{
    assert(str);
    if (*str == '\0')
    {
        return 0;
    }
    return 1 + my_strlen1(str + 1);
}
//非递归
int my_strlen2(const char *str)
{
    assert(str);
    int count = 0;
    char *p = str;
    while (*p)
    {
        if (*p == '\0')
        {
            return 0;
        }
        else
        {
            p++;
            count++;
        }
    }
    return count;
}
int my_strlen3(const char *str)
{
    char *p = str;
    while (*p != '\0')
    {
        p++;
    }
    return p - str;       //指针-指针表示指针间跨越的个数
}
int main()
{
    char str[] = "abcdef";
    printf("len1 = %d\n", my_strlen1(str));
    printf("len2 = %d\n", my_strlen2(str));
    printf("len3 = %d\n", my_strlen3(str));
    system("pause");
    return 0;
}

结果如下:

结果

2.模拟实现strcpy、strcat

#include <stdio.h>
#include <windows.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;
}
char* my_strcpy(char* dest, const char* src)
{
    char *ret = dest;
    assert(dest);
    assert(src);
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}
int main()
{
    char arr[20] = { 0 };
    char *p = arr;
    my_strcpy(p, "Hello");
    printf("%s\n", p);
    my_strcat(p, " world!");
    printf("%s\n", p);
    system("pause");
    return 0;
}

结果如下:

结果

3.模拟实现strcmp

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

int my_strcmp(const char *str1, const char *str2)
{
    assert(str1);
    assert(str2);
    while (*str1 != '\0' && *str2 != '\0')
    {
        if (*str1 == *str2)
        {
            str1++, str2++;
        }
        else if (*str1 > *str2)
        {
            return 1;
        }
        else
        {
            return -1;
        }
    }
    if (*str1 != '\0')      //如果str1长说明str1比str2大
    { 
        return 1;       
    }
    else if (*str2 != '\0')    //如果str2长说明str2比str1大
    {
        return -1;
    }
    else
    {
        return 0;
    }
}
int main()
{
    char str1[] = "abcdeg";
    char str2[] = "abcdef";
    int ret = my_strcmp(str1, str2);
    if (ret > 0)
    {
        printf("%s is greater than %s\n", str1, str2);
    }
    else if (ret == 0)
    {
        printf("%s is the same as %s\n", str1, str2);
    }
    else
    {
        printf("%s is less than %s\n", str1, str2);
    }
    system("pause");
    return 0;
}

结果如下:

结果

4.模拟实现strncpy、strncat

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

char* my_strncat(char* dest, const char* src,int num)
{
    char *ret = dest;
    assert(dest);
    assert(src);
    while (*dest)
    {
        dest++;
    }
    while (num && (*dest++ = *src++))       //拷贝num长的字符串到目标字符串中
    {
        num--;
    }
    *dest++ = '\0';      //将最后的'\0'拷入字符串中
    return ret;
}
char* my_strncpy(char* dest, const char* src,int num)
{
    char *ret = dest;
    assert(dest);
    assert(src);
    while (num && (*dest++ = *src++))       //拷贝num长的字符串到目标字符串中
    {
        num--;
    } 
    if (num > 0)
    {
        while (--num)
        {
            *dest++ = '\0';     //若num比源字符串长,那么多出的要拷贝字符用'\0'代替
        }
    }
    return ret;
}
int main()
{
    char arr[20] = { 0 };
    char *p = arr;
    my_strncpy(p, "Hellol",5);
    printf("%s\n", p);
    my_strncat(p, " world!!",7);
    printf("%s\n", p);
    system("pause");
    return 0;
}

结果如下:

结果

5.模拟实现strncmp

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

int my_srtncmp(const char *str1, const char *str2, size_t num)
{
    assert(str1);
    assert(str2);
    while (num && (*str1 == *str2))      //比较str1和str2中前num个字符的大小
    {
        str1++;
        str2++;
        num--;
    }
    if (num > 0)
    {
        return *str1 - *str2;       //将所有字符比较完后证明两字符串相等
    }
    else
    {
        return *(str1 - 1) - *(str2 - 1);     //当遇到不相等时,指向的是不相等的字符
    }
}
int main()
{
    char str[][5] = { "rode", "ride", "root" };
    int i = 0;
    for (; i < 3; i++)
    {
        if (my_srtncmp(str[i], "rore", 2) == 0)
        {
            printf("result [%d] :%s\n", i, str[i]);
        }
    }
    system("pause");
    return 0;
}

结果如下:

结果

6.模拟实现strchr(查找字符在字符串中第一次出现的位置)

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

char * my_strchr(const char * str, int ch)
{
    assert(str);
    while (*str && (*str != (char)ch))     //判断对应字符是否是所找字符
    {
        str++;
    }
    if (*str == (char)ch)
    {
        return (char *)str;      //若找到了则返回它的地址
    }
    return NULL;
}

int main()
{
    char str[] = "This is a sample string";
    char *p = my_strchr(str, 's');
    if (p != NULL)
    {
        printf("find the char at : %d\n", p - str + 1);    //找到目标字符出现的位置
    }
    else
    {
        printf("could not find the char\n");
    }
    system("pause");
    return 0;
}

结果如下:

结果

7.模拟实现strstr(查找子串)

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

char *my_strstr(const char *dest, const char *src) 
{
    assert(dest);
    assert(src);
    char *start = (char *)dest;
    char *substart = (char *)src;
    char *ret = (char *)dest;    //保存dest首地址
    while (*ret)
    {
        start = ret;
        while (*start && *substart && (*start == *substart))
        {
            start++;
            substart++;
        }
        if (*substart == '\0')
        {
            return ret;
        }
        substart = (char *)src;
        ret++;         //得到原起始位置的下一个位置
    }
    return NULL;
}
int main()
{
    char str[20] = "abcdefghijk";
    char *p = str;
    printf("%s\n",my_strstr(p, "defg"));
    system("pause");
    return 0;
}

结果如下:

结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值