C语言模拟实现strcpy、strncpy、strcmp、strcat、strstr

本文详细介绍了如何使用C语言从零开始实现常见的字符串操作函数,包括字符串复制、字符串连接、字符串比较、子字符串查找等功能,并提供了相应的测试代码。

1,模拟实现strcpy

功能:字符串拷贝函数
代码:

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

测试:

int main()
{
    char str1[20];//必须给足够大的空间保证str2能存储
    char* str2 = "HowAreYou";
    char* ret = my_strcpy(str1, str2);
    printf("%s\n", ret);
    system("pause");
    return 0;
}

这里写图片描述

2,模拟实现strncpy

功能:类似于strcpy,可以将字符串中的n个字符拷贝
代码:

char* my_strncpy(char* dest, const char* src, int n)
{
    assert(dest);
    assert(src);
    char* ret = dest;
    while (n)
    {
        *dest++ = *src++;
        n--;
    }
    if (*(dest - 1) != '\0');
    {
        *dest = '\0';
    }
    return ret;
}

测试:

int main()
{
    char str1[5];
    char* str2 = "abcdefg";
    char* ret = my_strncpy(str1, str2,4);
    printf("%s\n", ret);
    system("pause\n");
    return 0;
}

这里写图片描述

3,模拟实现strcmp

功能:字符串比较函数,相等返回0,小于返回小于0的数,大于则返回大于0的数
代码:

int my_strcmp(char* arr, char* str)
{
    assert(arr);
    assert(str);
    while (*arr == *str)
    {
        if (*arr == '\0' || *str == '\0')
        {
            return 0;
        }
        arr++;
        str++;
    }
    return *arr - *str;
}

测试:

int main()
{
    char *p1 = "ab";
    char *p2 = "abcd";
    char *p3 = "defab";
    printf("%d\n", my_strcmp(p1, p1));    //0  
    printf("%d\n", my_strcmp(p1, p2));    //-99 
    printf("%d\n", my_strcmp(p1, p3));    //-3 
    printf("%d\n", my_strcmp(p3, p1));    //3
    system("pause\n");
    return 0;
}

这里写图片描述

4,模拟实现strcat

功能:字符串追加函数
代码:

char* my_strcat(char* dest, char* src)
{
    assert(dest);
    assert(src);
    char* ret = dest;
    while (*dest)
    {
        *dest++;
    }
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}

测试:

int main()
{
    char str1[20] = "hello ";
    char* str2 = "world";
    char* ret = my_strcat(str1, str2);
    printf("%s\n", ret);
    system("pause\n");
    return 0;
}

这里写图片描述

5,模拟实现strstr

功能:判断一个字符串是否是另一个字符串的子串,如果是,则返回在这个字符串中首次出现的位置,如果不是,返回NULL
代码:

char* my_strstr(const char* str, const char*substr)
{
    const char* s1 = str;
    const char* s2 = substr;
    const char*  cur = str;
    assert(str);
    assert(substr);
    if (*substr == '\0')
    {
        return str;
    }
    while (cur)
    {
        s1 = cur;
        s2 = substr;
        while (*s1 == *s2)
        {
            s1++;
            s2++;
        }
        if (*s2 == '\0')
            return cur;
        if (*s1 == '\0')
            return NULL;
        cur++;
    }
    return NULL;
}

测试:

int main()
{
    const char* str = "abcdefg";
    const char* substr = "bcd";
    char* ret = my_strstr(str, substr);
    if (ret == NULL)
    {
        printf("No\n");
    }
    else
    {
        printf("%s\n", ret);
    }
    system("pause\n");
    return 0;
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值