C语言模拟实现strlen、strcpy、strcat、strstr、strcmp、memcpy、memmove

一、strlen函数

1.函数介绍

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0’)。

之前我在博客中写过关于数组运算中strlen和sizeof的区别,这里就不再多说了,附上连接https://blog.csdn.net/cherrydreamsover/article/details/81589838

2.函数原型

这里写图片描述

3.模拟实现
  • 方式一:
//计数器方式实现strlen函数
#include<stdio.h>

int my_strlen1(const char* str)
{
    int count = 0;
    while (*str)
    {
        count++;
        str++;
    }
    return count;
}
int main()
{
    int ret = 0;
    char arr[10] = "abcdef";
    ret = my_strlen1(arr);
    printf("arr的长度为:%d\n", ret);
    return 0;
}
  • 方式二:
//通过函数递归实现strlen函数
#include<stdio.h>

int my_strlen2(const char* str)
{
    if (*str == '\0')
        return 0;
    else
        return 1 + my_strlen2(str+1);
}
int main()
{
    int ret = 0;
    char arr[10] = "abcdef";
    ret = my_strlen2(arr);
    printf("arr的长度为:%d\n", ret);
    return 0;
}
  • 方式三:
//通过指针的减操作实现strlen函数
#include<stdio.h>
int my_strlen3(const char* str)
{
    char* p = str;
    while (*p != '\0')
    {
        p++;
    }
    return p - str;
}
int main()
{
    int ret = 0;
    char arr[10] = "abcdef";
    ret = my_strlen3(arr);
    printf("arr的长度为:%d\n", ret);
    return 0;
}
  • 三种方式的运行结果一样,如下:
    这里写图片描述

二、strcpy函数

1.函数介绍

strcpy是一种C语言的标准库函数,strcpy把从src地址开始且含有’\0’结束符的字符串复制到以dest开始的地址空间,返回值的类型为char*。

2.函数原型

这里写图片描述

3.模拟实现

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

char* my_strcpy(char* dest, const char* src)
{
    char* p = src;
    assert(src != NULL);
    assert(dest != NULL);

    while ((*dest++ == *src++))
    {
        ;
    }
    return p;
}
int main()
{
    int a[10];
    char* p = "dbsi";
    printf("%s\n", my_strcpy(a, p));
    return 0;
}

运行结果:
这里写图片描述

三、strcat函数

1.函数介绍

将两个char类型连接。
char d[20]=”GoldenGlobal”; char *s=”View”; strcat(d,s);
结果放在d中
printf(”%s”,d);
输出 d 为 GoldenGlobalView (中间无空格)
d和s所指内存区域不可以重叠且d必须有足够的空间来容纳s的字符串。
返回指向d的指针。

2.函数原型

这里写图片描述

3.模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
    assert(dest );
    assert(src );
    char* p = dest;
    while (*dest != '\0')
    {
        dest++;
    }
    while (*dest++ = *src++)
    {
        ;
    }
    return p;
}

int main()
{
    char arr1[20] = "hello ";
    char arr2[] = "world!";
    printf("%s\n", my_strcat(arr1, arr2));
    return 0;
}

运行结果:
这里写图片描述

四、strstr函数

1.函数介绍

strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。

2.函数原型

这里写图片描述

扫描二维码关注公众号,回复: 2809032 查看本文章
3.模拟实现
#include<stdio.h>
#include<assert.h>
char *my_strstr(const char* str1, const char* str2)
{
    assert(str1);
    assert(str2);
    char* p = (char*)str1;
    char* substr = (char*)str2;
    char* s = NULL;

    if (*str2 == '\0')
        return NULL;

    while (*p)
    {
        s = p;
        substr = str2;
        while (*s && *substr && (*s == *substr))
        {
            s++;
            substr++;
        }
        if (*substr == '\0')
            return p;
        p++;
    }
}

int main()
{
    char* a = "abcdefghj";
    char* b = "efghj";
    printf("%s\n", my_strstr(a, b));
    return 0;
}

运行结果:
这里写图片描述

五、strcmp函数

1.函数介绍

C/C++函数,比较两个字符串
设这两个字符串为str1,str2,
若str1==str2,则返回零;
若str1< str2,则返回负数;
若str1>str2,则返回正数。

2.函数原型

这里写图片描述

3.模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcmp(const char* src, const char* dest)
{
    assert(src);
    assert(dest);

    int ret = 0;
    while (!(ret = *(unsigned char*)(src)-*(unsigned char*)(dest)) && *dest)
    {
        src++;
        dest++;
    }

    if (ret < 0)
        return -1;
    else if (ret>0)
        return 1;

    return ret;
}

int main()
{
    char* a = "abcde";
    char* b = "abcde";
    printf("%d\n", my_strcmp(a, b));
    return 0;
}

运行结果:
这里写图片描述

六、memcpy函数

1.函数介绍

memcpy指的是c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。

2.函数原型

这里写图片描述

3.模拟实现
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, void* src, size_t count)
{
    assert(dest);
    assert(src);
    char* ret = dest;

    while (count--)
    {
        *(char*)dest = *(char*)src;
        dest = (char*)dest + 1;
        src = (char*)src + 1;
    }
    return ret;
}

int main()
{
    char a[10] = "";
    char b[10] = "sdfghj";
    printf("%s\n", my_memcpy(a, b, 5));
    return 0;
}

运行结果:
这里写图片描述

七、memmove函数

1.函数介绍

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

2.函数原型

这里写图片描述

3.模拟实现
#include<stdio.h>
#include<assert.h>

void* my_memmove(void* dest, const void* src, size_t count)
{
    assert(dest);
    assert(src);

    char* ret = dest;
    if (dest <= src || (*(char*)dest) >= (*(char*)src + count))
    {
        while (count--)
        {
            *(char*)dest = *(char*)src;
            dest = (char*)dest + 1;
            src = (char*)src + 1;
        }
    }
    else
    {
        dest = (char*)dest + count - 1;
        src = (char*)src + count - 1;

        while (count--)
        {
            *(char*)dest = *(char*)src;
            dest = (char*)dest - 1;
            src = (char*)src - 1;
        }
    }

    return ret;
}

int main()
{
    char a[20] = "abcd";
    char b[10] = "cderfgh";
    printf("%s\n", my_memmove(a, b, 5));
    return 0;
}

运行结果:
这里写图片描述

补充:
memmove的处理措施:
(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝
(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝
(3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝

猜你喜欢

转载自blog.csdn.net/cherrydreamsover/article/details/81673975
今日推荐