【C语言】库函数的模拟实现

目录

一、strlen

模拟实现:

二、strcat

模拟实现:

三、strcmp

模拟实现:

四、strstr

模拟实现

五、memcpy

模拟实现:

六、memmove

模拟实现


一、strlen

C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。

模拟实现:

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

int Mystrlen(const char* str)//const可以防止字符串内容被改变
{
	assert(str);//防止传入空指针
	int count = 0;
	while (*str++)
	{
		count++;
	}
	return count;
}

二、strcat

C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。

返回值:该函数返回一个指向最终的目标字符串 dest 的指针

模拟实现:

const char *Mystrcat(char *str1, const char *str2)
{
    assert(str1 && str2); 
	char* p1 = str1;//复制一份目标字符串头指针
	while (*str1)//先找str1中的 \0
	{
		str1++;
	}
	while (*str1++ = *str2++)//拷贝字符串
	;
	return p1;//返回最终的目标字符串
}

三、strcmp

C 库函数 int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较。

返回值:

str1 > str2  返回值大于0

str1 < str2 返回值小于0

str1 == str2 返回值等于0

注意:字符串的比较方式为:两个字符串自左向右逐个字符相比(按 ASCII 值大小相比较),直到出现不同的字符或遇 \0 为止。如:

1."A"<"B" 
2."A"<"AB" 
3."abcdz" > "abcdefghi"

模拟实现:

int Mystrcmp(const char *str1, const char *str2)
{
    assert(str1 && str2);
    while (*str1 == *str2)
    {
        if (!(*str1)) //两者匹配到结尾还是相同,结尾\0的ASCII码为0
           return 0;

        str1++;
        str2++;
    }
    if (*str1 > *str2) //就算一个指针先到了结尾,结尾\0的ASCII码也是最小的
        return 1;
    else
        return -1;
}

四、strstr

C 库函数 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。

模拟实现

const char *Mystrstr(const char *str1, const char *str2)
{
    assert(str1 && str2); // str1 与 str2不能是空指针
    const char *p1, *p2, *t;

    if (*str2 == '\0')//排除str2长度为0的情况
        return str1;
    p1 = str1;
    while (*p1 != '\0')
    {
        p2 = str2;
        while (*p1 && (*p1 != *str2))//p1与str2首元素匹配
        {
            p1++;
        }
        t = p1;//记录匹配成功的位置
        while (*p1 && *p2 && *p2 == *p1)//其中一个到了末尾就停下
        {
            p1++;
            p2++;
        }
        if (!(*p2))//如果p2到了末尾
        return t;
        p1=t+1;//p1回到第一次匹配成功的下一位
    }
    return NULL;//没有找到
}

五、memcpy

C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1

模拟实现:


void* Mymemcpy(void* str1, const void* str2, int n)
{
    assert(str1 && str2);
    char* p1 = (char*)str1,*p2 = (char*)str2;//char大小为1可以用来逐个字节操作
    int i;
    for (i = 0; i < n; i++)
    {
        p1[i] = p2[i];
    }
    return str1;
}

六、memmove

C 库函数 void *memmove(void *str1, const void *str2, size_t n) 从 str2 复制 n 个字符到 str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。

如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。

如果重叠

 如果反过来就要换方向

模拟实现

void *Mymemove(void *str1, const void *str2, int n)
{
    assert(str1 && str2);
    char *p1 = (char *)str1, *p2 = (char *)str2;
    int i;
    if (str1 < str2)//这里是考虑指向的内容重叠所以拷贝的方向有区别
        for (i = 0; i < n; i++)
        {
            p1[i] = p2[i];
        }
    else
        for (i = n - 1; i >= 0; i--)
        {
            p1[i] = p2[i];
        }
    return str1;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值