字符串函数和内存函数

一.字符串函数:

1.strcpy:(char* strcpy(char* destination, char* source))

(1)使用:

第一个参数:拷贝的数组,第二个参数:被拷贝的字符串,返回值为一个char*类型的字符指针。

(2)模拟实现:

char* my_strcpy(char* dest, const char* sor)
{
	assert(dest && sor);
	char* ret = dest;
	while (*dest++ == *sor++)
	{
		;
	}
	return ret;
}

2.strcmp:(int strcmp(const char* str1, const char* str2))

(1)使用:

第一个参数:字符串1,第二个参数:字符串2,返回值:int

(2)模拟实现:

int my_strcmp(const char* str1, const char* str2)
{
	while (*str1 != '\0' && *str2 != '\0')
	{
		if (*str1 != *str2)
		{
            //不相等
			return *str1 - *str2;
		}
		str1++;
		str2++;
	}
    //返回为0,则表示字符串相等
	return 0;
}

3.strcat:(char* strcat(char* destination, char* source))

(1)使用:

第一个参数:目标字符串,第二个参数:源字符串,返回值:char*类型的指针

ps:目标空间必须足够大,目标字符串和源字符串必须以'\0'结束。

(2)模拟实现:

char* my_strcat(char* dest, char* sor)
{
	char* ret = dest;
	while (*dest)
	{
		dest++;
	}
	while (*dest++ = *sor++)
	return ret;
}

4.strncpy:(char* strcpy(char* destination, char* source, size_t num))

(1)使用:

对source字符串的前num个字符进行拷贝,拷贝到destination字符串中去

(2)模拟实现:

char* my_strncpy(char* dest, const char* sor, size_t num)
{
    //判断dest和sor是否为空指针,如果为则断言报错
	assert(dest && sor);
	char* ret = dest;
	while (num--)
	{
		*dest = *sor;
		dest++;
		sor++;
	}
	return ret;
}

(3)效果实现:

5.strncmp:(int strcmp(const char* str1, const char* str2, size_t num))

(1)使用:

比较str1和str2字符串的前num个字符,看是否相等。

(2)模拟实现:

int my_strncmp(const char* str1, const char* str2, size_t num)
{
	assert(str1 && str2);
	while (num--)
	{
		if (*str1 != *str2)
		{
			return *str1 - *str2;
		}
		str1++;
		str2++;
	}
    //返回0表示相等,否则不相等
	return 0;
}

(3)效果实现:

6.strncat:(char* strcat(char* destination, char* source, size_t num))

(1)使用:

将源字符串的前num个字符拼接到目的字符串中'\0'的后面(包括'\0'),会在拼接完成后默认加上'\0'

(2)模拟实现:

char* my_strncat(char* dest, const char* sor, size_t num)
{
	char* ret = dest;
	assert(dest && sor);
	while (*dest)
	{
		dest++;
	}
	while (num--)
	{
		*dest++ = *sor++;
	}
	*dest = '\0';
	return ret;
}

(3)效果实现:

7.strstr:(char* strstr(char* destination, char* source, size_t num))

(1)使用:

在目标字符串中找源字符串出现的第一次位置,并且返回从该位置开始后面所以得字符串内容。

(2)模拟实现:

 

char* my_strstr(const char* str1, const char* str2)
{
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* cur = str1;
	if (str2 == NULL)
	{
		return (char*)str1;
	}
	while (*cur != '\0')
	{
		s1 = cur;
		s2 = str2;
		//*s1=='\0'就是在这个字符串中找不到相对应的字符串
		//*s2=='\0'就是代表已经匹配成功(已成功找到)需要跳出循环
		while (*s1 == *s2 && *s2 != '\0' && *s1 != '\0')
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			//const char*也是一种类型,而返回类型为char*,所以需要强制转换
			return (char*)cur;
		}
		cur++;
	}
	return (char*)NULL;
}

(3)效果实现:

没找到,返回空指针。

找到,返回找到位置后面的所以内容

 

8.strtok:(char* strtok(char* str1, char* str2))

(1)使用:

字符串分割,按照str2字符串中的符号对str1字符串进行分割

(2)效果实现:

ps:打印的时候,只需要传一次ret,后面只需要在传NULL就可以找到上次分割后的位置。

 二.内存函数:

1.memmove:(void* memmove(void* des, void* sor, size_t num))

(1)使用:

将sor字符串向后num个字节移动到des字符串中去。

(2)模拟实现:

void* my_memmove(void* des, void* sor, size_t num)
{
	void* ret = des;
	if (des >= sor)
	{
		//从后向前拷贝
		des = (char*)des + num - 1;
		sor = (char*)sor + num - 1;
		while (num--)
		{
			*(char*)des = *(char*)sor;
			des = (char*)des - 1;
			sor = (char*)sor - 1;
		}
	}
	else
	{
		//从前向后拷贝
		while (num--)
		{
			*(char*)des = *(char*)sor;
			des = (char*)des + 1;
			sor = (char*)sor + 1;
		}
	}
	return ret;
}

(3)效果实现:

2.memcpy:(void* memcpy(void* des, void* sor, size_t num)) 

(1)使用:

将sor字符串向后num个字节拷贝到des字符串中去。

(2)模拟实现:

void* my_momcpy(void* des, void* sor, size_t num)
{
	while (num--)
	{
		*(char*)des = *(char*)sor;
		des = (char*)des + 1;
		sor = (char*)sor + 1;
	}
}

3.memset:(void* memcpy(void* str, void value, size_t num)) 

(1)使用:

将str字符串向后num个字节赋值成value。

(2)效果实现:

4.memcmp:(int memcmp(void* str1, void* str2, size_t num))

(1)使用:

将str1和str2的前num个字节进行判断,并进行比较。

(2)效果实现:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值