模拟实现一些简单库函数

模拟实现一些简单的库函数

  • strlen
  • strcpy
  • strcat
  • strcmp
  • strstr
  • memcpy
  • memmove
strlen的模拟实现
  • strlen是用来求字符串长度,从首字符开始数,一直到'\0'才停下。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int my_strlen(const char* str)
{
    int count = 0;                //用count来记录字符个数
    assert(str);                  //判断指针不能为空
    while (*str != '\0')          
    {
        count++;
        str++;
    }
    return count;   
}
int main()
{
    char arr[] = "this is life";
    int ret = my_strlen(arr);
    printf("%d\n", ret);
    system("pause");
    return 0;
}
strcpy的模拟实现
  • strcpy是用来拷贝字符串的,将源字符串拷到目标字符串,所以目标空间要保证足够大。
char *my_strcpy(char *dest, const char *src)
{
    char *ret = dest;                    //记录目标字符串的起始地址
    assert(dest && src);                 //判断指针不能为空
    while (*src != '\0')  
    {
        *dest = *src; 
        src++;
        dest++;
    }
    *dest = '\0';                       //将'\0'拷贝过去
    return ret;
}
int main()
{
    char arr1[20] = "aaaaaaaaaaaa";
    char arr2[] = "world";
    printf("%s\n", my_strcpy(arr1, arr2));
    system("pause");
    return 0;
}
strcat的模拟实现
  • strcat是用来连接字符串的,将源字符串连接到目标字符串中,找到源字符串的’\0’,然后挨着往后拷贝,所以要保证目标空间足够大。
char *my_strcat(char *dest, const char *src)
{
    char *ret = dest;              //保存目标字符串起始地址
    assert(dest && src);            //判断指针有效性
    while (*dest != '\0')          //寻找目标字符串'\0'
    {
        dest++;
    }
    while (*dest++ = *src++)       //从目标字符串'\0'处开始往后拷贝
    {
        ;
    }
    return ret;
}
int main()
{
    char arr1[20] = "hello";
    char arr2[] = " world";
    printf("%s\n", my_strcat(arr1, arr2));
    system("pause");
    return 0;
}
strcmp的模拟实现
  • strcmp是用来比较字符大小的,如果相等,返回0;如果第一个字符大于第二个字符,返回1;如果小于,则返回-1.
int my_strcmp(const char *p1, const char *p2)
{
    assert(p1 && p2);               //判断指针有效性
    while (*p1 == *p2)              //找不同元素
    {
        if (*p1 == '\0')            //如果相等,返回0;
            return 0;
        p1++;
        p2++;
    }
    if (*p1 > *p2)                  //如果第一个字符大于第二个字符,返回1;
        return 1;
    else                            //如果第一个字符小于第二个字符,返回-1
        return -1; 
}
int main()
{
    char *p1 = "abcd";
    char *p2 = "abc";
    printf("%d\n", my_strcmp);
    system("pause");
    return 0;
}
strstr的模拟实现
  • strstr是用来在一个字符串中寻找字符串的,如果找到,则返回它在字符串的起始位置。
char *my_strstr(const char *str, const char *substr)
{         
    const char *s1 = str;               //用于在父字符串上移动 
    const char *s2 = substr;            //用于在子字符串上移动
    const char *cur = str;              //记录寻找子串的起始位置
    assert(str && substr);              //判断指针有效性
    while(*cur)                         //循环到父字符串结束
    {
        s1 = cur;                       //记录每次子串在父串的位置
        while ((*s1 == *s2) && (*s1 != '\0') && (*s2 != '\0'))
        {
            s1++;
            s2++;
        }
        if (*s2 == '\0')                //寻找到子串
            return cur;
        cur++;                          
    }
    return NULL;                        //找不到返回为空
}
int main()
{
    char *p1 = "abbbcde";
    char *p2 = "bbc";
    printf("%s\n", my_strstr(p1, p2));
    system("pause");
    return 0;
}
memcpy的模拟实现
  • memcpy和strcpy都是可以拷贝字符串的,但两者有所差异,strcpy把字符串全部拷进去(包括’\0’),memcpy把指定的字节拷过去,所以它可以可字符型的,也可以拷贝整形的。
void *my_memcpy(void *dest, const void *src, size_t count)
{
    void *ret = dest;              //用来记录目标串的起始地址
    assert(dest && src);           //判断指针有效性
    while (count--)                //用count来控制拷贝的字节数
    {
        *(char *)dest = *(char *)src;
        src = (char *)src + 1;
        dest = (char *)dest + 1;
    }
    return ret;
}
int main()
{
    int arr1[] = { 1,2,3,4,5,6 };
    int arr2[] = { 7,8,9,0 };
    //char arr1[20] = "aaaaaaaa";
    //char arr2[] = "edrf";
    my_memcpy(arr1, arr2, 12);
    system("pause");
    return 0;
}
memmove的模拟实现
  • memmove是用来拷贝重叠的元素,思想和memcpy一样,只是在拷贝的时候要分清楚从前向后拷贝,还是从后向前拷贝。
void *my_memmove(void *dest, const void *src, size_t count)
{
    void *ret = dest;              //保存目标地址
    assert(dest && src);           //判断指针有效性
    if (dest < src)                
    {
        while (count--)
        {
            *(char *)dest = *(char *)src;
            src = (char *)src + 1;
            dest = (char *)dest + 1;
        }
    }
    else
    {
        while (count--)
        {
            *((char *)dest + count) = *((char *)src + count);
        }
    }
    return ret;
}
int main()
{
    int arr1[] = { 1,2,3,4,5,6,7,8 };
    my_memmove(arr1, arr1 + 2, 16);
    system("pause");
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值