C语言学习笔记(8)

笔记内容:
1.模拟strlen;
2.模拟strcpy;
3.模拟strcmp;
4.模拟strcat;
5.模拟strstr;
6.qsort;
7.模拟memcpy;
8.模拟memmove;

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

int Mystrlen(char *p)
{
	int i = 0;
	while (*p != '\0'){
		p++;
		i++;
	}
	return i;
}

char *Mystrcpy(char *dst, const char *src)
{
	assert(dst);
	assert(src);
	char *ret = dst;
	while (*dst = *src){
		dst++;
		src++;
	}
	return ret;
}

int Mystrcmp(const char *str1, const char *str2)
{
	assert(str1);
	assert(str2);
	while (*(str1) == *(str2))
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	if (*str1 > *str2)
		return 1;
	else
		return -1;
}

char *Mystrcat(char *dst, const char *src)
{
	char *start = dst;
	int len_dst = strlen(dst);
	dst += len_dst;
	while (*dst = *src){
		dst++;
		src++;
	}
	return start;
}

char *Mystrstr(char *dst, const char * src)
{
	assert(dst);
	assert(src);
	int i, j, k;
	for (i = 0; dst[i] != '\0'; i++)
	{
		for (j = i, k = 0; src[k] != '\0'&&dst[j] == src[k]; j++, k++)
		{
			;
		}
		if (src[k] == '\0'&&k > 0)
			return &dst[i];
	}
	return NULL;
}

int int_cmp(const void *p1, const void *p2)
{
	return (*(int *)p1 - *(int *)p2);
}

struct stu{
	char name[16];
	int age;
	char sex;
};
void *My_memcpy(void *dst, const void *src, int num)
{
	assert(dst);
	assert(src);
	char *_dst = (char*)dst;
	char *_src = (char*)src;
	while (num){
		*_dst = *_src;
		_dst++;
		_src++;
		num--;
	}
	return dst;
}

void *My_memmove(void *dst, const void *src, int num)
{
	assert(dst);
	assert(src);
	char *_dst = (char*)dst;
	char *_src = (char*)src;
	if (_dst > _src&&_dst < _src + num){
		//right -> left
		_src = _src + num - 1;
		_dst = _dst + num - 1;

		while (num){
			*_dst = *_src;
			_dst--;
			_src--;
			num--;
		}
	}
	else{
		//left -> right
		while (num){
			*_dst = *_src;
			_dst++;
			_src++;
			num--;
		}
	}
	return dst;
}

int main()
{
	//模拟strstr
	char *arr1 = "abcdefg";
	char *arr2 = "de";
	printf("%s\n", Mystrstr(arr1, arr2));

	//模拟strcat
	char arr1[32] = "hello ";
	char *arr2 = "world";
	printf("%s", Mystrcat(arr1, arr2));

	//模拟strcmp
	const char *arr1 = "abcde";
	const char *arr2 = "aedbc";
	printf("%d\n", Mystrcmp(arr1, arr2));

	//模拟strcpy
	char dst[32] = { '\0' };
	const char *src = "1901210139";
	printf("%s\n", Mystrcpy(dst, src));

	//模拟strlen
	char *p = "1901210139";
	int len = Mystrlen(p);
	printf("%d", len);

	//qsort
	int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
	int num = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, num, sizeof(int), int_cmp);
	for (int i = 0; i < num; i++){
		printf("%d", arr[i]);
	}
	printf("\n");

	//模拟实现memcpy
	int a[] = { 1, 2, 3, 4, 5 };
	int b[5] = { 0 };
	My_memcpy(b, a, sizeof(a));
	struct stu tom = { "Tom", 21, 'm' };
	struct stu peter;
	My_memcpy(&peter, &tom, sizeof(tom));

	//模拟实现memmove
	char str[] = "abcdefg";
	int len = strlen(str) + 1;
	My_memmove(str, str + 1, len);//bcdefg\0
	My_memmove(str + 1, str, len);//aabcdefg
	system("pause");
	return 0;
}

模拟memcpy监视窗口:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值