字符函数和内存函数的实现

在学习C语言的时候,离不开字符函数和内存函数的使用,只要理解了函数的功能,那这些函数使用都挺简单。但是将来作为码农的我们,必须理解这些函数是怎么实现的。

下面是字符函数和内存函数合集。


一、字符函数

1、strcat

#include<assert.h>
#include <stdio.h>
char* my_strcat(char* dest, const char* src)
{
	assert(dest && src); // 断言 dest和src都不为空

	char* ret = dest;
	while (*dest) // dest到最后一个字节
		dest++;
	while (*dest++ = *src++) // 追加src到dest
		;

	return ret;
}
int main()
{
	char arr1[20] = "abcd";

	my_strcat(arr1, "efg");
	printf("%s", arr1);
}

2、strcmp

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

int my_strcmp(const char* s1, const char* s2)
{
	assert(s1 && s2); // 断言 s1和s2都不为空
	while (*s1 == *s2) // 当前s1和s2的值相同
	{
		if (*s1 == '\0') // s1或s2这个时候是最后一个字节 说明两个字符相等
			return 0;
		s1++;
		s2++;
	}
	return *s1 - *s2; // 如果不相等返回相应数值
}
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abcdef";
	int ret = my_strcmp(arr1, arr2);
	if (ret < 0)
		printf("<\n");
	else if (ret > 0)
		printf(">\n");
	else
		printf("=\n");
}

3、strcpy

#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, char* src)
{
	char* ret = dest;
	assert(dest && src); // 断言 dest和src不为空
	while ((*dest++ = *src++) != '\0') // 将src一次赋给dest
		;

	return ret;
}

int main()
{
	char arr1[20] = "abcde";
	char arr2[] = "dfdssd";

	my_strcpy(arr1, arr2);
	printf("%s", arr1);
}

4、strlen

#include<stdio.h>
#include<assert.h>
int my_strlen(char* s1)
{
	assert(s1); // 断言 s1不为空
	char* p = s1;
	while (*s1 != '\0') // s1循环到最后一个字节
		s1++;
	return s1 - p; // 返回字节差值
}
int main()
{
	char arr1[] = "abcdef";

	printf("%d", my_strlen(arr1));
}

5、strstr

#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2); // 断言 str1和str2不为空
	char* s1;
	char* s2;
	char* cp = str1; // cp指向str1中与str2首字符相匹配的字符
	if (*str2 == '\0') // str2为空串
		return str1;
	while (*cp)
	{
		// s1和s2用来匹配两字符串相同字符
		s1 = cp;
		s2 = str2;
		// 匹配相同字符
		while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0') // s2结束
			return cp;
		cp++; // 如果当前不匹配cp加一
	}
	return NULL; // cp指向str1末尾时,说明没有与str2匹配项
}
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "bc";

	char* ret = my_strstr(arr1, arr2);
	if (ret == NULL)
		printf("找不到!\n");
	else
		printf("%s\n", ret);
}

二、内存函数

1、memcpy

#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, const void* src, size_t count)
{
	void* ret = dest;
	assert(dest && src);

	while (count--) // 字节数
	{
		*(char*)dest = *(char*)src; //单字节赋值
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}
int main()
{
	int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };

	my_memcpy(arr1, arr2, 4*sizeof(arr1[0]));
	int i = 0;
	for (i = 0; i < 10; i++)
		printf("%d ", arr1[i]);
	return 0;
}

2、memmove

在这里插入图片描述
当dest的内存比src小时,我们想要把src开始的值赋给dest,如果从后向前执行,06 00 00 00会覆盖
04 00 00 00,05 00 00 00覆盖03 00 00 00,这时的03 00 00 00 04 00 00 00这段内存已经变为
04 00 00 00 05 00 00 00结果如下图
在这里插入图片描述
在这里插入图片描述
当dest的内存比src大时,我们想要把src开始的值赋给dest,如果从前向后执行,01 00 00 00会覆盖03 00 00 00,02 00 00 00覆盖04 00 00 00,这时的03 00 00 00 04 00 00 00这段内存已经变为01 00 00 00 02 00 00 00结果如下图
在这里插入图片描述

#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dest, const void* src, size_t count)
{
	void* ret = dest;
	assert(dest && src);
	if (dest < src) // 当src指向的内存值大于dest指向的内存值 采用从前向后赋值
	{
		while (count--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else // 除上面情况 采用从后向前赋值
	{
		while (count--)
		{
			*((char*)dest + count) = *((char*)src + count);
		}
	}
	return ret;
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr + 2, arr, 4 * sizeof(arr[0]));
	int i = 0;
	for (i = 0; i < 10; i++)
		printf("%d ", arr[i]);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT自习小空间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值