模拟字符串函数实现

目录

strcat()

strcmp() 

strstr()

strcpy()

memcpy()

memmove()


strcat()

1.函数功能:在目标字符串后追加一个源字符串
char * strcat ( char * destination, const char * source );函数返回目标字符串的起始地址。2.实现原理:找到目标字符串末尾的'\0',将其覆盖追加源字符串                                      3.代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>

char* my_strcat(char* dest,char* src)
{
	assert(dest&&src);// 断言,防止过来的dest和src为控空指针
	char* ret = dest; //接收一个返回指针
	while (*dest)
	{
		dest++;       //先找到目标字符串的'\0'位置
	}
	while (*dest++ = *src++)//覆盖'\0'的情况下追加源字符串
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20]="abcd";
	char arr2[] = "efgh";
	/*my_strcat(arr1, arr2);*/
	printf("%s", my_strcat(arr1, arr2));
	return 0;
}

4.注意点:需要确保目标字符串有足够的空间,源字符串结尾应该有'\0'.

strcmp() 

1.函数功能:比较字符串(比较的是内容而不是长度),

int strcmp ( const char * str1, const char * str2 );函数返回一个整型

2.实现原理:两字符串逐个比较,以ASCII的值相减,若相等结果为0,反之不为0

3.代码:

int my_strcmp(const char*s1,const char*s2) 
{
	assert(s1&&s2);
	while (*s1 == *s2)
	{
		if (*s1 == '\0')
		{
			return 0;
		}
		s1++;
		s2++;
	}
	return *s1 - *s2;   //在系统中以ASCII码形式计算,返回一个整型值
}
int main()
{
	//strcmp是比较字符串的内容,不是长度
	char arr1[] = "abcd";
	//char arr1[]="abq";
	char arr2[] = "abcd";
	if (my_strcmp(arr1, arr2) == 0)   //相等,返回结果为0
	{
		printf("相同\n");
	}
	else
	{
		printf("不相同\n");
	}
	return 0;
}

strstr()

 

1.函数功能:在主串中判断子串是否存在,

char * strstr (char * str1, const char * str2 );放回值为主串中首次出现子串的地址

2.实现原理:主串和子串首字符比较,若不相同,主串向后移动一个字符,子串回到首字符位置,重复以往,直到子串或者主串出现'\0'

3.代码:

char* my_strstr(const char* str1,const char* str2)     //在一个字符串中查找字符串
{
	assert(str1 && str2);
	char* s1;
	char* s2;
	char* cp = str1;     //将主串首字符地址指向的指针赋给一个新创建的指针
	
	while (*cp)
	{
		s1 = cp;        //每次重新比较都需要将s1移动到主串首字符的地址处
		s2 = str2;      //每次重新比较s2需移动到子串首字符地址处
		while (*s1 != '\0'&&*s2 != '\0'&&*s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return cp;
		}
		cp++;
	}
	//找不到
	return NULL;             //找不到子串返回空指针
}
int main()
{
	char arr1[] = "abcdefg";
	char arr2[] = "abcd";
	char* ret = (my_strstr(arr1, arr2));
	if (ret != NULL)
	{
		printf("找到了\n");
	}
	else
	{
		printf("找到了\n");
	}
	return 0;
}

strcpy()

1.函数功能:将源字符串复制到目标字符串上并覆盖,

char * strcpy ( char * destination, const char * source );放回值为目标字符串的首字符地址

2.实现原理:定义两个指针分别指向目标字符串和源字符串首字符地址,逐个向后移动赋值

3.代码:

char* my_strcpy(char*dest ,char*src)
{
	assert(dest && src);
	char* ret = dest;       
	while (*src)
	{
		*dest = *src;
		dest++;
		src++;
	}
	return ret;
}
int main()
{
	char arr1[20] = "abcdzz";
	char arr2[] = "efgh";
	char* ret = my_strcpy(arr1, arr2);
	printf("%s", ret);
}

memcpy()

1.函数功能: 将源字符串的内存复制到目标字符串的内存中

void * memcpy ( void * destination, const void * source, size_t num );返回值为一个无类型指针

2.实现原理:确定源字符串占用内存的字节数,后逐一复制到目标字符串中

3.代码:

void* my_memcpy(void* dest, void* src, int num)    //num为复制的内存大小
{
	void* ret = dest;
	assert(dest&&src);
	int count = num;
	while (count--)                              
	{
		*(char*)dest = *(char*)src;             //强制转为char类型指针,助于每个字节复制
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8 };
	int arr2[20] = { 0 };
	my_memcpy(arr2, arr1, 16);                  //my_memcpy(arr2, arr1, sz*sizeof(arr1[0]))
	int i = 0;
	for (i = 0; i < 20; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

4.函数特点:但将同一个字符串的地址赋给两个指针,且复制范围和作用范围存在覆盖会出现特殊情况:

memmove()

1.函数功能:将同一个字符串的地址赋给两个指针,且复制范围和作用范围存在覆盖不会出现特殊情况

2.实现原理:分成两种情况,当目标地址比源地址低,从末端向前逐比特交换;当目标地址比源地址高,从前端向后逐比特交换

3.代码:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爆裂突破手

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

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

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

打赏作者

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

抵扣说明:

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

余额充值