str库函数模拟实现

常见str函数功能表:


strcat——将字符串str2连接到str1之后,并返回指针str1

strncat——将字符串from 中至多count个字符连接到字符串to中,追加空值结束符。返回处理完成的字符串

strchr——返回一个指向str 中ch 首次出现的位置,当没有在str 中找ch到返回NULL

strrchr——返回一个指针,它指向字符ch 在字符串str,末次出现的位置,如果匹配失败,返回NULL

strcoll——比较字符串str1 和 str2, 很象strcmp. 但是, strcoll使用在目前环境中由setlocale()设定的次序进行比较。

strcmp——比较两个字符串是否相等比较字符串str1 and str2,相等返回0,大于返回大于0的数,小于返回小于0的数

strncmp——比较字符串str1 和 str2中至多n个字符

strlen——返回字符串str 的长度( 即空值结束符之前字符数目)

strcpy——复制字符串from 中的字符到字符串to,包括空值结束符。返回值为指针to

strncpy——将字符串from 中至多count个字符复制到字符串to中,如果字符串from 的长度小于count,其余部分用'\0'填补。返回处理完成的字符串

strstr——返回一个指针,它指向字符串str2 首次出现于字符串str1中的位置,如果没有找到,返回NULL

strspn——返回字符串str1中第一个不包含于字符串str2的字符的索引


代码实现:


strcat


char* MyStrcat(char *src, const char*dst)
{
	assert(src && dst);
	int count = 0;
	char* ret = src;
	while (*src)	//如果把++合并写到上面来会多加一次
	{
		src++;
	}
	while (*src++ = *dst++)
	{
		;
	}
	return ret;
}

strncat


char* MyStrncat(char* str1, const char* str2,size_t n)
{
	assert(str1 && str2);
	char* tem = str1;

	while (*str1)
	{
		str1++;
	}

	while (n--)
	{
		if (!(*str1++ = *str2++))
		{
			return tem;
		}
		*str1 = '\0';
	}

	return tem;
}


strrchr


const char* MyStrchr(const char* str, char ch)
{
	assert(str);
	while (*str)
	{
		if (*str == ch)
			return str; 
		str++;
	}
	return NULL;
}

strchr


const char* MyStrrchr(const char* str,char ch)
{
	assert(str);
	const char* tmp = str;
	while (*str++)	//先让指针指向\0
	{
		;
	}

	while (--str != tmp)	//只要str还没有减到tmp刚开始保存的初始位置
	{
		if (*str == ch)
			return str;
	}

	return NULL;
}


strcoll


int MyStrcoll(const char* dst, const char* src)
{
	assert(dst && src);
	int ret = 0;
	while (!(ret = *dst-*src))
	{
		dst++;
		src++;
	}
	if (ret > 0)
		return 1;
	else if (ret < 0)
		return -1;
	else
		return ret;
}

stcpy


char* MyStrcpy(char* dst, const char* src)		//src为原字符串,dst为目标字符串
{
	assert(src && dst);
	char* ret = dst;	//先让ret保存dst的起始位置
	while (*dst++ = *src++)		//将src中的值一次拷贝到dst之中
	{
		;
	}
	return dst;
}

strlen


size_t MyStrlen1(const char* str)	//加const防止str被修改
{
	assert(str);		//断言,防止str为空指针或者野指针的情况
	size_t count = 0;
	while (*str++)
	{
		++count;
	}
	return count;
}

size_t MyStrlen2(const char* str)
{
	assert(str);
	const char* eos = str;
	while (*eos++)
		;
	return (eos - str - 1);
}

strcmp


int MyStrcmp(const char* dst, const char* src)
{
	assert(dst && src);
	int ret = 0;
	while (!(ret = *dst - *src))
	{
		src++;
		dst++;
	}
	
	if (ret < 0)
		return -1;

	else if(ret > 0)
		return 1;

	return ret;
}

strncmp


int MyStrncmp(const char* str1, const char* str2, size_t n)
{
	assert(str1 && str2);
	int ret = 0;
	while (!(ret = *str1 - *str2) && n--)
	{
		++str1;
		++str2;
	}

	if (ret > 0)
	{
		return 1;
	}

	else if (ret < 0)
	{
		return -1;
	}
	return ret;
}


strncpy


char* MyStrncpy(char* str1, const char* str2, size_t n)
{
	assert(str1 && str2);
	if (!n)
		return str1;

	char* tmp = str1;
	while (n && (*str1++ = *str2++))
	{
		n--;
	}
	
	if (n)
	{
		while (n--)
		{
			*str1--;
		}
		str1 = '\0';
	}
	return tmp;
}


strstr


const char* MyStrstr(const char*str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1)
	{
		if (*str1++ == *str2++)
		{
			;
		}
		++str1;
		return str1;
	}
	return NULL;
}

strspn


size_t MyStrspn(const char* str1, const char* str2)
{
	size_t index = 0;
	while (*str1++ == *str2++)
	{
		index++;
	}
	return index;
}





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

double_happiness

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

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

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

打赏作者

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

抵扣说明:

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

余额充值