Daily code_05 (字符串函数实现,strcpy、strcat、strstr、strcmp、strchr、memmove、memcpy)

嘿嘿、由于这次的代码比较简单,且思路都大同小异,就不一一写了,看注释吧!
1.实现strcpy

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
char* my_strcpy(char* dest, const char* src)
{
	char* ret = dest;
	//拷贝字符串,直到被拷贝字符串结束
	while (*src)
	{
		*dest++ = *src++;
	}
	return ret;
}
int main()
{
	char str[100] = "abcdef";
	char ret[100] = { 0 };
	my_strcpy(ret, str);
	printf("%s\n", ret);
	system("pause");
	return 0;
}

2.实现strcat

//实现strcat
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
char* Strcat(char* str1, char* str2)
{
	char* ret = str1;
	//将ret指针指向字符串\0之前的最后一字符
	while (*ret)
	{
		ret++;
	}
	//将str2的字符依次赋值给str1
	while ((*ret++ = *str2++) != '\0')
	{
		;
	}
	//返回指针str1的首元素地址
	return str1;
}
int main()
{
	char str1[100] = "hello ";
	char str2[] = "world";
	Strcat(str1, str2);
	printf("%s\n", str1);
	system("pause");
	return 0;
}

3.实现strstr

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
char* My_Strstr(const char* str1, const char* str2)
{
	char* cp = (char*)str1;
	char* substr = (char*)str2;
	char* s1 = NULL;
	if (*str2 == NULL)
	{
		return NULL;
	}
	while (*cp)
	{
		s1 = cp;
		substr = str2;
		while (*s1 != '\0' && *substr != '0' && (*s1 == *substr))
		{
			s1++;
			substr++;
		}
		if (*substr == '\0')
		{
			return cp;
		}
		cp++;
	}
}
int main()
{
	char* str1 = "abcdefg";
	char* str2 = "bc";
	char* ret = 0;
	ret = My_Strstr(str1, str2);
	printf("%s\n",ret);
	system("pause");
	return 0;
}

4.实现strcmp

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int My_Strcmp(const char* str1, const char* str2)
{
	int ret = 0;
	while (*str2 != '0')
	{
		//判断字符是否相等,若不相等比较哪个字符较大
		ret = (unsigned char*)str1 - (unsigned char*)str2;
		str1++;
		str2++;
	}
	if (ret > 0)
	{
		return 1;
	}
	else if (ret < 0)
	{
		return -1;
	}
	return ret;
}
int main()
{
	char* str1 = "ashdg";
	char* str2 = "abskd";
	printf("%d\n", My_Strcmp(str1, str2));
	system("pause");
	return 0;
}

5.实现strchr

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int My_Strchr(const char* str, char ch)
{
	int count = 0;
	//若找到相应字符 返回字符所在位置,应注意的是字符在字符串位置
	//要是字符下标+1
	while (*str)
	{
		if (ch == *str)
		{
			return ++count;
		}
		count++;
		str++;
	}
	return -1;
}
int main()
{
	char str[100] = "abcdefghijklmn";
	char ch = 'c';
	printf("%d\n", My_Strchr(str, ch));
	system("pause");
	return 0;
}

6.实现memmove

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.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 str1[100] = "hello world";
	char str2[100] = { 0 };
	printf("%s\n", Memmove(str2, str1, 11));
	system("pause");
	return 0;
}

7.实现memcpy

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
char* My_Memcpy(char* str1, char* str2, size_t n)
{
	char* ret = str1;
	while (n--)
	{
		*str1++ = *str2++;
	}
	return ret;
}
int main()
{
	char str1[100] = "abcdefg";
	char str2[100] = { 0 };
	My_Memcpy(str2, str1, 3);
	printf("%s\n", str2);
	system("pause");
	return 0;
}

额外加strncmp、strncoy、strncat


#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
char* my_strncpy(char* arr1, const char* arr2, int n)
{
	char* ret = arr1;
	//将arr2的前n个字符加在arr1后面
	while (n--)
	{
		*arr1++ = *arr2++;
	}
	return ret;
}
int my_strncmp(const* arr1, const char*arr2, int n)
{
	int count = 0;
	for (int i = 0; i < n; i++)
	{
		//判断字符相等
		if (*arr1 != *arr2)
		{
			count++;
		}
		arr1++;
		arr2++;
	}
	if (n != count)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}
char* my_strncat(char* arr1, const char* arr2, int n)
{
	char* ret = arr1;
	//将指针arr1指向\0之前的最后一个字符
	while (*++arr1)
	{
		;
	}
	//将arr2前n的字符加在arr1后面
	while (n--)
	{
		*arr1++ = *arr2++;
	}
	return ret;
}
int main()
{
	char arr1[100] = "hello";
	char arr2[100] = "world";
	char* ret3 = my_strncat(arr1, arr2, 5);
	printf("%s\n", ret3);
	int ret2 = my_strncmp(arr1, arr2, 5);
	printf("%d\n", ret2);
	char* ret = my_strncpy(arr2, arr1, 5);
	printf("%s\n", ret);
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值