strlen,strcpy,strcat,strcmp,strncpy,strncat,strncmp,strstr,memcpy,memmove,memcmp,memset函数的自我实现

strlen函数的自我实现(这里函数的返回值标准为size_t)

1.计数法

#include<stdio.h>
#include<assert.h>
#include<string.h>
int my_strlen(const char* arr)
{
	assert(arr != NULL);
	int count = 0;
	while (*arr)
	{
		count++;
		arr++;
	}
	return count;

}


int main()
{
	char arr[] = "abcdef";
	int count=my_strlen(arr);
	printf("字符串长度为%d", count);


	return 0;
}

2.递归法

#include<stdio.h>
#include<assert.h>
#include<string.h>
int my_strlen(const char* arr)
{
	assert(arr != NULL);
	if (*arr == 0)
		return 0;
	else
		return 1 + my_strlen(arr+1);

}


int main()
{
	char arr[] = "abcdef";
	int count=my_strlen(arr);
	printf("字符串长度为%d", count);


	return 0;
}

3.指针法

#include<stdio.h>
#include<assert.h>
#include<string.h>
int my_strlen(const char* arr)
{
	assert(arr != NULL);
	char* ret = arr;
	while (*arr)
	{
		arr++;
	}
	return arr - ret;
}


int main()
{
	char arr[] = "abcdef";
	int count=my_strlen(arr);
	printf("字符串长度为%d", count);


	return 0;
}

strcpy函数的自我实现

#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcpy(char* arr1, const char* arr2)
{
	assert(arr1);
	assert(arr2);
	char* ret = arr1;
	while (*arr1++ = *arr2++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = "abahkwtw";
	char arr2[] = "akjnf";
	char*ret=my_strcpy(arr1, arr2);
	printf("%s", ret);
	return 0;
}

strcat函数的自我实现

#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcat(char* arr1, const char* arr2)
{
	assert(arr1);
	assert(arr2);
	char* ret = arr1;
	while (*arr1!='\0')
	{
		arr1++;
	}
	while (*arr1++ = *arr2++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[30] = "anfjl";
	char arr2[] = "alfn";
	char* ret = my_strcat(arr1, arr2);
	printf("%s", ret);


	return 0;

}

strcmp函数的自我实现

#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strcmp(const char* p1, const char* p2)
{
	assert(p1);
	assert(p2);
while (*p1 == *p2)
{
	if (*p1 == 0)
		return 0;
	p1++;
	p2++;//注意
}
	return *p1 - *p2;
}
int main()
{
	char* p1 = "sjlsf";
	char* p2 = "sjlnf";
	int math = my_strcmp(p1, p2);
	printf("%d", math);


	return 0;
	
}

strncpy函数的自我实现

#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strncpy(char* p1, const char* p2, size_t count)
{
	assert(p1 && p2);
	char* ret = p1;
	while (count--)
	{
		*p1++ = *p2++;

	}
}
int main()
{
	char arr1[30] = { 0 };
	char arr2[30] = { 0 };
	printf("请输入你本来的语句");
	gets(arr1);
	printf("请输入你要复制的语句");
	gets(arr2);
	int count = 0;
	printf("请输入你要交换的数量");
	scanf("%d", &count);
	
	char* ret=my_strncpy(arr1, arr2,count);
	printf("%s\n", ret);
	return 0;
}

strncat函数的自我实现

#include<assert.h>
#include<stdio.h>
#include<string.h>
char* my_strncat(char* arr1, const char* arr2, size_t num)
{
    char*ret=arr1;
	while (*arr1)
	{
		arr1++;
	}
	while (num--)
	{
		*arr1++ = *arr2++;
	}
    *arr1='\0';
    return ret;
}
int main()
{
	char arr1[30] = "kla";
	char arr2[] = "ajn";
	printf("输入你要连接的数量\n");
	int num = 0;
	scanf("%d", &num);

	char*ret=my_strncat(arr1, arr2,num);
	printf("结果为%s", arr1);
	return 0;
}

strncmp函数的自我实现

#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strcmp(const char* p1, const char* p2,size_t count)
{
	assert(p1);
	assert(p2);
	while (*p1 == *p2)
	{
		count--;
		if (count== 0)
			return 0;
		p1++;
		p2++;//注意
	}
	return *p1 - *p2;
}
int main()
{
	char* p1 = "sjlsf";
	char* p2 = "sjlnf";
	int count = 0;
	printf("请输入对比的数字\n");
	scanf("%d", &count);
	int math = my_strcmp(p1, p2,count);
	printf("%d", math);


	return 0;

}

strstr函数的自我实现

#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strstr(const char* arr1, const char* arr2)
{
	assert(arr1 && arr2);
	char* s1 = NULL;
	char* s2 = NULL;
	char* cur = (char*)arr1;
	if (*arr2 == '\0')
		return (char*)arr1;
	while (*cur)
	{
		s1 = cur;
		s2 = (char*)arr2;
		while (*s1 && *s2 && (*s1 == *s2))
		{
			s1++;
			s2++;

		}
		if (*s2 == '\0')
		{
			return cur;
		}
		cur++;
	}
	return NULL;



}
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "ghi";
	char* ret=my_strstr(arr1, arr2);
	if (ret == NULL)
		printf("不是");
	else
		printf("是");

	return 0;
}

memcpy函数的自我实现

#include<stdio.h>
#include<assert.h>
#include<string.h>
void*my_memcpy(void* arr2, void* arr1, size_t num)
{
	void* ret = arr2;
	assert(arr2 && arr1);
	//一个字节一个字节往下拿肯定不会错;
	while (num--)
	{
		*((char*)arr2)++ = *((char*)arr1)++;
		/*++(char*)arr2;
		++(char*)arr1;*/
	}
	return ret;
}
//c语言标准
//memcpy 只要处理 不重叠的内存拷贝就可以
//memmove 处理重叠的内存拷贝
int main()
{
	int arr1[] = {1,2,3,4,5,6,7,8,9,10};
	//int arr2[5] = { 0 };
	memcpy(arr1+2, arr1, 20);//单位字节
	for (int i = 0; i <= 9; i++)
	{
		printf("%d\n", arr1[i]);
	}

	return 0;
}

memmove函数的自我实现

#include<stdio.h>
#include<assert.h>
#include<string.h>
void* my_memmove(void* dest, void* src, size_t num)
{
	assert(dest && src);
	void* ret = src;
	if (dest < src)
	{
		while (num--)
		{
			*((char*)dest)++ = *((char*)src)++;
		}
	}
	else
	{
		//src = (size_t)src + num-1;
		//dest = (size_t)dest + num-1;//注意
		while (num--)
		{
			/**((char*)(dest))-- = *((char*)(src))--;*/
			*((char*)dest + num) = *((char*)src + num);
		}
		return ret;
	}
}





int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
		//int arr2[5] = { 0 };
		my_memmove(arr1+2, arr1, 20);//单位字节
		for (int i = 0; i <= 9; i++)
		{
			printf("%d\n", arr1[i]);
		}
	return 0;
}

memcmp函数的自我实现

#include<stdio.h>
#include<assert.h>
#include<string.h>
void* my_memcmp(void* p1, const void* p2, size_t count)
{
	assert(p1);
	assert(p2);
	while (*(char*)p1 == *(char*)p2)
	{
		count--;
		if (count== 0)
			return 0;
		((char*)p1)++;
		((char*)p2)++;//注意
	}
	void* ret = (void*)(*(char*)p1 - *(char*)p2);
	return ret;
}
int main()
{
	int arr1[] = {1,2,3,4,5};
	int arr2[] = { 1,2,3,4,5 };
	int ret=my_memcmp(arr1, arr2, sizeof(arr1));
	printf("%d\n", ret);
	return 0;
}

memset函数的自我实现

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

void* my_memset(void* str, int c, size_t n)
{
	
	assert(str);
	void* ret = str;
	while (n--)
	{
		*((char*)str)++ = c;
		
	}
	return ret;

}
int main()
{
	int arr[10] = { 0 };
	my_memset(arr, 1, 10);
	//让十个字节改为1
	for (int i = 0; i <= 9; i++)
	{
		printf("%d", arr[i]);
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

凡人12138

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

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

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

打赏作者

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

抵扣说明:

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

余额充值