C语言库函数实现

1、strstr

在字符串 str1 中查找第一次出现字符串 str2 的位置

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 != NULL && str2 != NULL);

	const char* tmpstr1 = str1;
	const char* tmpstr2 = str2;

	int i = 0, j = 0;

	while(tmpstr1[i] != '\0' && tmpstr2[j] !='\0')
	{
		if (tmpstr1[i] == tmpstr2[j]) {
			i++; j++;
		}
		else {
			i = i - j + 1;
			j = 0;
		}
	}

	if (tmpstr2[j] == '\0') {
		char* ret = (char*)tmpstr1 + (i - j);
		return ret;
	}
	return NULL;
}
char* mystrstr(char* arr,char* brr) {
	char* black = arr;
	while (*black != '\0') {
		char* red = black;
        char* sub = brr;
		while (*sub != '\0' && *red != '\0' && *sub == *red) {
			red++;
			sub++;
		}
		if (*sub == '\0') {
			return black;
		}
		else if (*red == '\0') {
			black++;
		}
		else if (*red != *sub) {
			black++;
		}
	}
	return NULL;
}

2、strlen

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

3、strcpy

char* my_strcpy(char* des, const char* src)
{
	assert(des && src);
	char* ret = des;
	while (*des++ = *src++){}
	return ret;
}

4、strcat

char* my_strcat(char* des, const char* src)
{
	assert(des && src);
	char* ret = des;
	while(*des){
		des++;
	}
	while (*des ++ = *src++){}
	return ret;
}

5、 memcpy

void* my_memcpy(char* arr, char* brr, size_t num) {
	assert(arr && brr);
	assert(num != 0);
	char* p1 = (char*)arr;
	char* p2 = (char*)brr;
	for (size_t i = 0; i < num; i++) {
		p1[i] = p2[i];
	}
	return arr;
}

6、memmove

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

void* my_memmove(char* arr, char* brr, size_t num) {
	assert(arr && brr);
	assert(num != 0);
	char* p1 = (char*)arr;
	char* p2 = (char*)brr;
//判断一下数组是否重叠,如果重叠,则需要逆序赋值
	if (*arr >= *brr && *brr <= *arr) {
		for (long i = (long)(num - 1); i >= 0; i--) {
			p1[i] = p2[i];
		}
	}
	else {
		for (size_t i = 0; i < num; i++) {
			p1[i] = p2[i];
		}
	}
	return arr;
}

7、strcmp

int my_strcmp(const char* str1, const char* str2) {
	assert(str1 && str2)
	while (*str1 != '\0' && *str2 != '\0') {
		if (*str1 > *str2) {
			return 1;
		}
		else if (*str1 < *str2) {
			return -1;
		}
		else {
			str1++; str2++;
		}
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值