一些字符 *** 作函数和内存 *** 作函数的实现(c语言)

一些字符 *** 作函数和内存 *** 作函数的实现(c语言),第1张

一些字符 *** 作函数和内存 *** 作函数的实现(c语言)

1.模拟实现strlen

声明:size_t strlen(const char*str)

(1)字符串以'’作为结束标志,strlen函数返回的是在字符串中''前面出现的字符个数(不包含'')

(2)参数指向的字符串必须以''结束

(3)函数返回值是size_t是无符号整数

实现的代码如下:

#include
int my_strlen(const char* str)
{
	int count = 0;
	while (*str)
	{
		count++;
		str++;
			
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	int len=my_strlen(arr);
	printf("%dn", len);
	return 0;
}

2.模拟实现strcpy

其声明char*strcpy(char*dest,const char*soure)

(1)源字符串必须以'’结束

(2)会将源字符串中的'',拷贝到目标空间

(3)目标空间必须足够大,以确保能存放源字符串

(4)目标空间必须可变

实现代码如下:

#include
void my_strcpy(char* s1,const char* s2)
{
	while (*s1++ = *s2++)
	{

	}
}
int main()
{
	char s1[20] = { 0 };
	char s2[] = "abcdef";
	my_strcpy(s1, s2);
	printf("%s", s1);
	return 0;
}

3.模拟实现strcmp

其声明int strcmp(const char*str1,const char*str2)

标椎规定:(1)str1大于str2返回大于0的数

                   (2)str1==str2返回0

                   (3)str1小于str2返回小于0的数

代码如下:

int my_strcmp(const char* src, const char* dst)
{
	int ret = 0;
	assert(src && dst);
	while (!(ret = *(unsigned char*)src - *(unsigned char*)dst) && *dst)
	{
		src++;
		dst++;
	}
	if (ret > 0)
		return 1;
	else if (ret < 0)
		return -1;
	return ret;
}
int main()
{
	char s1[] = "abcdef";
	char s2[] = "cdefab";
	int ret=my_strcmp(s1, s2);
	if (ret > 0)
		printf("s1>s2");
	else if (ret == 0)
		printf("s1=s2");
	else
		printf("s1 

4.模拟实现strcat

其声明char*strcat(char*dest,const char*soure)

(1)源字符串必须以''结束

(2)目标空间必须足够大,能容纳下源字符串的内容

(3)目标空间必须修改

(4)不能自己给自己追加

代码如下:

#include
#include
char* my_strcat( char* s1,const char* s2)
{
	char* ret = s1;
	assert(s1 && s2);
	while (*s1)
	{
		s1++;
	}
	while (*s1++ = *s2++)
	{
		;
	}
	return ret;
}
int main()
{
	char s1[20] = "abcdef";
	char s2[] = "ghijk";
	my_strcat(s1, s2);
	printf("%sn", s1);
	return 0;
}


5.模拟实现strstr

其声明char*strstr(const char*s1,const char*s2)

代码如下:

//#include
//#include
char* my_strstr(const char* str1,const char*str2 )
{
	assert(str1 && str2);
	char* s1 = str1;
	char* s2 = str2;
	char* cur = str1;
	if (!*str2)
		return str1;
	while (*s1&&*s2)
	{
		s1 = cur;
		s2 = str2;
		while (*s1==*s2&&*s1 && *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '');
		return cur;
		cur++;
		
	}
	return NULL;
}
int main()
{
	char s1[] = "abcdef";
	char s2[] = "abcd";
	char* ret = my_strstr(s1, s2);
	if (ret !=NULL)
		printf("yesn");
	else
		printf("non");

	return 0;
}

6.模拟实现memcpy

其声明void*memcpy(void*dest,const void*source,size_t num)

(1)函数memcpy从source的位置开始向后复制num个字节的数到dest的内存位置

(2)这个函数在遇到''的时候并不会停下来

(3)如果source和dest有任何重叠的地方,复制结果都是为定义

在一些编译器中memcpy处理不了内存重叠的情况

代码如下:

#include
#include
void* my_memcpy(void* dest, void* src, size_t num)
{
	void* ret = dest;
	assert(dest && src);
	while (num--)
	{
		*(char*)dest = *(char*)src;
		++(char*)dest;
		++(char*)src;
	}
	return ret;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[] = { 5,4,3,2,1 };
	my_memcpy(arr1,arr2,5*sizeof(int));
		for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

7.模拟实现memmove

其声明void*memmove(void*dest,const void*source,size_t num)

如果源空间和目标空间重叠就用memmove处理

代码如下:

#include
#include
void* my_memmove(void* dest, void* src, size_t count)
{
	void* ret = dest;
	assert(dest && src);
		if (dest < src)
		{
			while (count--)
			{
				*(char*)dest = *(char*)src;
				++(char*)dest;
				++(char*)src;
			}
		}
		else
		{
			while (count--)
			{
				*((char*)dest + count) = *((char*)src + count);
			}

		}
		return ret;
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr + 2, arr, 5*sizeof(int));
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

作者实属初学,写博客也是作者学习的一个过程,难免文章中有内容理解不到位或者有不当之处,还请朋友们不吝指正,评论留下各自的见解,相互讨论。希望大家多多给予支持,赠人玫瑰,手有余香!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5715051.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存