string库函数中常见函数的模拟实现

以下是string库函数中的常用函数的模拟实现

1. my_strlen
模拟strlen函数,以’\0’为结尾,计算字符串中字符的个数,不含’\0’,返回值是size_t类型的无符号整型;

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

2. my_strcpy

这里是引用

模拟strcpy函数,把源字符串拷贝至目标空间,含源字符串的’\0’,拷贝过程以源字符串的’\0’为终点,目标空间可变,修改目标空间并返回目标空间的初始地址;

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

3. my_strcat
模拟strcat函数,把源字符串嫁接至目标字符串后端,含源字符串的’\0’,嫁接过程以源字符串的’\0’为终点,目标空间可变,修改目标空间并返回目标空间的初始地址;

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

4. my_strcmp
模拟strcmp函数,从前往后比较两个字符串中对应序列字符的ASCII码值的大小,比较结果:

  1. 比较过程中,第一个字符串的字符大于第二个字符串的对应字符,则返回大于零的整数;
  2. 比较过程中,第一个字符串的字符小于第二个字符串的对应字符,则返回小于零的整数;
  3. 比较过程中,第一个字符串的字符均等于第二个字符串的对应字符,且两个字符串长度相等,则返回0;
  4. 比较过程中,第一个字符串的字符均等于第二个字符串的对应字符,但第一个字符串比第二个字符串长,比较结束后,返回第一个字符串比第二个字符串多出的那部份的第一个字符对应的ASCII码值;
  5. 比较过程中,第一个字符串的字符均等于第二个字符串的对应字符,但第二个字符串比第一个字符串长,比较结束后,返回第二个字符串比第一个字符串多出的那部份的第一个字符对应的ASCII码值的相反数;
int my_strcmp(const char *str1,const char *str2)
{
    assert(*str1&&*str2);
    while(*str1&&*str2)
    {
        if(*str1>*str2)
        {
            return 1;
        }
        else if(*str1<*str2)
        {
            return -1;
        }
        str1++;
        str2++;
    }
    return *str1-*str2;
}

5. my_strncpy
模拟strncpy函数,从源字符串拷贝指定数目的字符至目标空间,若指定的数目大于源字符串的长度,则拷贝过程以源字符串的’\0’为终点,连同’\0’一起拷贝,目标空间可变,修改目标空间并返回目标空间的初始地址;

 char *my_strncpy(char *dest,const char *src,size_t len)
{
    assert(dest&&src);
    size_t l=0;
    char *s=dest;
    for(l=0;l<len;l++)
    {
        *s++=*src++;
        if(*src=='\0')
        {
            *s=*src;
            break;
        }
    }
    return dest;
}

6. my_strncat
模拟strncat函数,从源字符串嫁接指定数目的字符至目标字符串后端,若指定的数目大于源字符串的长度,则嫁接过程以源字符串的’\0’为终点,连同’\0’一起拷贝,目标空间可变,修改目标空间并返回目标空间的初始地址;

 char *my_strncat(char *dest,const char *src,size_t len)
{
    assert(dest&&src);
    char *s=dest;
    while(*s)
    {
        s++;
    }
    size_t l=0;
    for(l=0;l<len;l++)
    {
        *s++=*src++;
        if(*src=='\0')
        {
            *s=*src;
            break;
        }
    }
    return dest;
}

7. my_strncmp
模拟strncmp函数,根据指定的长度用strcmp函数的方式比较两个字符串,若指定的长度大于第二个字符串长度,则实现strcmp函数比较的完整过程;

 int my_strncmp(const char *str1,const char *str2,size_t len)
{
    size_t l=0;
    for(l=0;l<len;l++)
    {
        if(*str1&&*str2)
        {
            if(*str1>*str2)
            {
                return 1;
            }
            else if (*str1<*str2)
            {
                return -1;
            }
        }
        else
        {
            break;
        }
        str1++;
        str2++;
    }
    return *str1-*str2;
}

8. my_strstr
模拟strstr函数,从目标空间中寻找和源字符串一致的字段,若找到,则返回与源字符串第一个字符一致的目标空间的字符的地址,否则,返回空指针,目标字符串和源字符串均不可修改;

 const char* my_strstr(const char *dest,const char *src)
{
    while(*dest)
    {
        if(*dest==*src)
        {
            const char *s1=dest;
            const char *s2=src;
            while(*s1&&*s2)
            {
                if(*s1!=*s2)
                {
                    break;
                }
                s1++;
                s2++;
            }
            if(*s2=='\0')
            {
                return dest;
            }
            else if(*s1=='\0'&&*s2!='\0')
            {
                return NULL;
            }
        }
        dest++;
    }
    return NULL;
}

9. my_strtok
模拟strtok函数,根据源字符串中含有的字符寻找目标空间中一致的字符,并以此字符为断点分割目标字符串,返回值为目标字符串起点地址或断点地址,每调用一次,返回的断点地址前进一格,跳至目标字符串末尾时,返回空指针;

 char* my_strtok(char *str,const char *p)
{
    static char *s=NULL;
    if(str!=NULL)
    {
        s=str;
    }
    else
    {
        str=s;
    }
    if(*str=='\0')
    {
        return NULL;
    }
    char *s1=str;
    while(*s1)
    {
        const char *p1=p;
        while(*p1)
        {
            if(*s1==*p1)
            {
                break;
            }
            p1++;
        }
        if(*p1!='\0')
        {
            *s1='\0';
            s=s1+1;
            return str;
        }
        s1++;
    }
    s=s1;
    return str;
}

10. my_memcpy
模拟memcpy函数,把源内存的数据信息按照指定字节数拷贝至目标内存空间,修改目标内存空间并返回目标空间的初始地址;

void *my_memcpy(void *dest,const void *src,size_t len)
{
	assert(dest&&src);
    size_t l=0;
    char *d=(char*)dest;
    char *s1=(char*)malloc(sizeof(char)*len);
    char *s2=s1;
    for(l=0;l<len;l++)
    {
        *s1=*(char*)src;
        s1++;
        src=(char*)src+1;
    }
    for(l=0;l<len;l++)
    {
        *d++=*s2++;
    }
    return dest;
}

11. my_memmove
模拟memmove函数,功能同memcpy函数,代码同行;
12. my_memcmp
模拟memcmp函数,按照指定字节数对两个内存空间逐个字节比较大小,若在指定字节数范围内两段内存空间每个字节存储的信息ASCII码值均相同,则返回0,若在指定字节数范围内两段内存空间对应字节存储的信息有所不同,则返回第一对不同的字节对应的信息ASCII码差值,若指定的字节数大于其中一个内存空间,则返回比较过程结束时指针指向的较大的内存空间的字节单元的信息的ASCiI码值(若第二个内存空间较大,则返回值取反);

 int my_memcmp(const void *str1,const void *str2,size_t len)
{
    assert(str1&&str2);
    char *s1=(char*)str1;
    char *s2=(char*)str2;
    size_t l=0;
    for(l=0;l<len;l++)
    {
        if(*s1!=*s2)
        {
            return *s1-*s2;
        }
        s1++;
        s2++;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像的目标属于哪个类别。 定位问题:确定目标在图像的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值