模拟实现字符串操作函数

本文介绍了C语言中几种基本的字符串操作函数,包括求字符串长度(my_strlen)、字符串拷贝(my_strcpy)、字符串连接(my_strcat)、子串查找(my_strstr)及字符串比较(my_strcmp),并提供了不同实现方式的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

my_strlen()

求字符串长度
遇到’\0’结束,不算’\0’
主函数

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

int main()
{
    char arr[] = "abcdef";
    printf("%d\n",my_strlen(arr));
    system("pause");
    return 0;
}

第一种方法:(设置计数器)

int my_strlen(const char *str)
{
    int len = 0;
    assert(str!=NULL);
    while (*str != '\0')
    {
        str++;
        len++;
    }
    return len;
}

第二种方法:(递归)

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

第三种方法:(指针-指针)

int my_strlen(const char *str)
{
    char *p = str;
    assert(str!=NULL);
    while (*p != '\0')
    {
        p++;
    }
    return p - str;
}

my_strcpy()

字符串拷贝
要拷贝’\0’,不要遗漏

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

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

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

my_strcat()

字符串连接函数

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

char *my_strcat(char*dest, const char *src)
{
    assert(dest != NULL);
    assert(src != NULL);
    char *ret = dest;
    //找到'\0'
    while (*dest != '\0')
    {
        dest++;
    }
    //拷贝
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}

int main()
{
    char arr1[] = "abcdef";
    char arr2[] = "abc";
    printf("%s\n", my_strcat(arr1, arr2));
    system("pause");
    return 0;
}

my_strstr()

判断字符串str2是否是str1的子串
1.如果是,则该函数返回str2在str1中首次出现的地址
2.如果不是,返回NULL

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

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

int main()
{
    char arr1[] = "ababcabcd";
    char arr2[] = "abca";
    printf("%s\n", my_strstr(arr1, arr2));
    system("pause");
    return 0;
}

my_strcmp()

逐个比较
出现不等,就得出比较结果
1.相等返回0
2.不等的情况,大于返回正数,小于返回负数

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

int my_strcmp(const char *p, const char *q)
{
    assert(p != NULL);
    assert(q != NULL);
    while (*p == *q)
    {
        if (p == '\0')
            return 0;
        ;
        p++;
        q++;
    }
    if (*p > *q)
        return 1;
    else
        return -1;
    /*return *p - *q;*/
}

int main()
{
    char arr1[] = "abcdf";
    char arr2[] = "abcdh";
    printf("%d\n", my_strcmp(arr1, arr2));
    system("pause");
    return 0;
}

my_memcpy()

内存拷贝函数
主函数

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

int main()
{
    int  arr1[] = { 1, 2, 3, 4, 5, 6 };
    int  arr2[] = { 9, 8, 7, 6, 5 };
    my_memcpy(arr1 + 2, arr2, 3 * sizeof(arr2[0]));
    system("pause");
    return 0;
}

第一种:

void *my_memcpy(void *dest, void *src, size_t sz)
{
    assert(dest != NULL);
    assert(src != NULL);
    char *pdest = (char *)dest;
    char *psrc = (char *)src;
    unsigned int i = 0;
    for (i = 0; i < sz; i++)
    {
        *pdest = *psrc;
        pdest++;
        psrc++;
    }
    return dest;
}

第二种:

void *my_memcpy(void *dest, void *src, size_t sz)
{
    assert(dest != NULL);
    assert(src != NULL);
    unsigned int i = 0;
    for (i = 0; i < sz; i++)
    {
        *(char *)dest = *(char *)src;
        ++(char *)dest;
        ++(char *)src;
    }
    return dest;
}

第三种:

void *my_memcpy(void *dest, void *src, size_t sz)
{
    assert(dest != NULL);
    assert(src != NULL);
    unsigned int i = 0;
    for (i = 0; i < sz; i++)
    {
        *(char *)dest = *(char *)src;
        dest=(char *)dest+1;
        src = (char *)src + 1;
    }
    return dest;
}

my_memmove()

从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改
主函数

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

int main()
{
    int  arr1[] = { 1, 2, 3, 4, 5, 6 };
    my_memcpy(arr1 + 2, arr2, 3 * sizeof(arr2[0]));
    system("pause");
    return 0;
}

实现

void *my_memmove(void *dest, void *src, size_t sz)
{
    void* ret = dest;
    //从前向后拷贝
    if (src > dest)
    {
        while (sz--)
        {
            *((char *)dest) = *((char *)src);
            dest = (char *)dest + 1;
            src = (char *)src + 1;
        }
    }
    //从后向前拷贝
    else
    {
        while (sz--)
        {
            *((char *)dest+ sz) = *((char *)src+sz);
        }
    }
    return ret;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值