C语言字符函数和字符串函数的模拟实现(二)


前言

上篇文章中介绍了C语言中的字符函数和字符串函数以及它们的使用方法。本文将介绍部分的函数模拟实现。
本文的函数的功能及其格式均在上一篇文中有所提及,请结合两篇文章一起看。上篇文章:C语言字符函数和字符串函数功能介绍(一)


一、strlen函数模拟实现

在模仿strlen实现其功能有以下三种方式:

1.1计数器方式

strlen函数是统计字符串到“\0”结束之前的字符个数。
计时器实现,代码如下:

#include<stdio.h>

int my_strlen(const char* str)
{
	int count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}

int main()
{
	char arr[] = "zxcvbnm";
	printf("%d\n", my_strlen(arr));
	return 0;
}

1.2不创建临时变量

第一种方法使用了临时变量count,下面将不用临时变量创建函数。
代码如下:

#include<stdio.h>

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

int main()
{
	char arr[] = "zxcvbnm";
	printf("%d\n", my_strlen(arr));
	return 0;
}

1.3运用指针的方式实现

这种方法则是运用指针的方式去实现。
代码如下:

#include<stdio.h>

int my_strlen(char* str)
{
	char* cur = str;
	while (*cur!='\0')
	{
		cur++;
	}
	return cur - str;//终点减去起点
}

int main()
{
	char arr[] = "zxcvbnm";
	printf("%d\n", my_strlen(arr));
	return 0;
}

二、strcpy函数模拟实现

strcpy函数的返回值是字符指针,在调用函数的返回值时需要注意。在下面的函数实现中我们需判断传来的字符串是否为空用到了断言assert,我们要调用函数头文件<assert.h>。
下面代码的作用是将arr的内容拷贝到arr1中,我们需传入两个字符数组的首地址,之后判断两个字符数组不为空,将arr的内容赋值到arr1中,最后返回起始地址emp。其中const修饰的不能改变其值。
代码如下(示例):

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

char* my_strcpy(char* des, const char* cur)
{
	assert(des!=NULL);
	assert(cur!=NULL);
	char* emp = des;
	while ((*des++ = *cur++));
	return emp;
}

int main()
{
	char arr[] = "zxcvbnm";
	char arr1[20] = { 0 };
	printf("%s\n", my_strcpy(arr1,arr));
	return 0;
}

三、strcat函数模拟实现

要注意strcat在给自己给自己追加时程序不会出任何结果,程序会崩溃。
下面的程序是给arr1后面追加arr。
代码如下:

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

char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	//找到目标的'\0'
	while (*dest)
	{
		dest++;
	}
	while ((*dest++ = *src++))return ret;
}

int main()
{
	char arr[20] = "abcdefg";
	char arr1[20] = { 0 };
	printf("%s\n", my_strcat(arr1, arr));
	return 0;
}

四、strstr函数模拟实现

下面程序是从arr中找arr1的子字符串。
代码如下:

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

char* my_strstr(const char* str1, const char* str2)
{
    char* cp = (char*)str1;
    char* s1, * s2;
    if (!*str2)
        return((char*)str1);
    while (*cp)
    {
        s1 = cp;
        s2 = (char*)str2;
        while (*s1 && *s2 && !(*s1 - *s2))
            s1++, s2++;
        if (!*s2)
            return(cp);
        cp++;
    }
    return NULL;//未找到子字符串
}

int main()
{
	char arr[20] = "abcdefg";
	char arr1[20] = "cd";
	printf("%s\n", my_strstr(arr, arr1));
	return 0;
}

五、strcmp函数模拟实现

下面的程序是比较arr1与arr的长度大小。
代码如下:

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

int my_strcmp(const char* src, const char* dst)
{
    int ret = 0;
    assert(src != NULL);
    assert(dst != NULL);
    while (!(ret = *(unsigned char*)src - *(unsigned char*)dst) && *dst)
        ++src, ++dst;
    if (ret < 0)
        ret = -1;
    else if (ret > 0)
        ret = 1;
    return ret;
}

int main()
{
	char arr[20] = "abcdefg";
	char arr1[20] = "abcd";
	printf("%d\n", my_strcmp(arr, arr1));
	return 0;
}

六、memcpy函数模拟实现

该程序作用是从arr1的位置开始向后复制2个字节的数据到arr的内存位置。
代码如下:

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

void* memcpy(void* dst, const void* src, size_t count)
{
    void* ret = dst;
    assert(dst!=NULL);
    assert(src!=NULL);
    while (count--)
    {
        *(char*)dst = *(char*)src;
        dst = (char*)dst + 1;
        src = (char*)src + 1;
    }
    return ret;
}

int main()
{
    char arr[20] = "abcdefg";
    char arr1[20] = "fghj";
    printf("%s\n", memcpy(arr, arr1,2));
    return 0;
}

七、memmove函数模拟实现

该函数作用同上个作用相同,不过该函数处理的源内存块和目标内存块是可以重叠的。
代码如下:

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

void* memmove(void* dst, const void* src, size_t count)
{
    void* ret = dst;
    if (dst <= src || (char*)dst >= ((char*)src + count))
    {
        while (count--) {
            *(char*)dst = *(char*)src;
            dst = (char*)dst + 1;
            src = (char*)src + 1;
        }
    }
    else
    {

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

int main()
{
    char arr[20] = "abcdefg";
    char arr1[20] = "fghj";
    printf("%s\n", memmove(arr, arr1, 6));
    return 0;
}

总结

这两篇文章介绍了C语言的字符和字符串函数,以及对部分函数的模拟实现。希望大家可以通过这两篇文章学习到对基本函数的使用。如有不足之处,希望大家可以指点出来.上篇文章:C语言字符函数和字符串函数功能介绍(一)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值