有关C语言字符串函数及内存函数的模拟实现

字符串函数

strlen函数

  我们知道,字符串以'\0'作为结束标志,strlen函数返回的是在此之前出现的字符个数,同时,易错点在于strlen函数返回值是size_t,注意与int的区分。

 以下是三种模拟实现方法

//第一种
int my_strlen(const char* str)
{
    int count=0;
    assert(str);
    while(*str)
    {
        count++;
        str++;
    }
    return count;
}
//第二种
int my_strlen(const char* str)
{
    assert(str);
    if(*str == '\0')
        return 0;
    else
        return 1+my_strlen(str+1);
}
//第三种
int my_strlen(const char* str)
{
    assert(str);
    char* p = s;
    while(*p)
        p++;
    return p-s;
}
strcpy函数

  此函数的功能是将第二个变量拷贝到第一个目标空间中去,要保证目标空间足够大,且能够修改,即不能是常量字符串,以下是模拟实现strcat函数

char *my_strcpy(char *dest,const char *src)
{
    char *p=dest;
    assert(dest);
    assert(src);
    while(*dest++=*src++)
    {
        ;
    }
    return (p);
}
strcat函数

  此函数的功能是将第二个变量追加到第一个目标空间之后,形成一个新的字符串,基本规则与strcpy相差不大,以下是模拟实现

char *my_strcat(char *dest,const char *src)
{
    char *p= dest;
    assert(dest);
    assert(src);
    while(*dest)
    {
        dest++;
    }
    while((*dest++=*src++))
    {
        ;
    }
    return ret;
}
 strcmp函数

  此函数用于比较两个字符串之间的大小,若前者大于后者,返回大于0数字,若相等,则返回0,若小于,返回小于0的数字。

int my_strcmp(const char* str1,const char* str2)
{
    int ret=0;
    asseert(str1);
    assert(str2);
    while(*str1==*str2)
    {
        if(*str1=='\0')
            return 0;
        str1++;
        str2++;
    }
    return *str1-*str2;
}


内存函数

memcpy函数

  void *memcpy(char* dest,char *src,size_t num),从src位置开始向后复制num个字节的数据到dest指向的内存位置,在遇到\0时不会停下。

void* my_memcpy(void* dest, const void* src, size_t count)
{
	void* p = dest;
	assert(dest);
	assert(src);
	while (count--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return (p);
}
memmove函数

  此函数用于处理目标内存块和源内存块重叠的情况,使得重叠时也能够进行处理。

void* my_memmove(void* dest, const void* src, size_t count)
{
    void* p = 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 (p);
}

到此结束,感谢阅读。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值