C++str函数中几个常用函数原型(vs2017下编译运行效果与源函数完全一样)

#define  _CRT_SECURE_NO_WARNINGS
#include<string>
#include<iostream>
#include<cassert>
using namespace std;

size_t mystrlen(const char *source);//字符串长度
char *mystrcat(char *destin, const char *source);  //	字符串拼接函数
char *mystrcpy(char *destin, const char *source);//拷贝一个字符串到另一个
int mystrcmp(const char *str1, const char *str2);  //串比较
char *mystrchr(const char *str, const char c);//在一个串中查找给定字符的第一个匹配之处
int my_strcmpi(const char *str1, const char *str2);//	 将一个串与另一个比较, 不管大小写
char *mystrstr(char *const dest, const char * const source);//在串中查找指定字符串的第一次出现


size_t mystrlen(const char *source)//字符串长度
{
	assert(source != nullptr);
	size_t count = 0;
	while (*source++!='\0')
	{
		count++;
	}

	return count;

}


char *mystrcat(char *destin,const char *source)  //	字符串拼接函数
{
	assert(destin != nullptr);
	assert(source != nullptr);
	char *temp = destin;
	while (*destin!= '\0')	//这里不知道为什么不能合并,那就老老实实写,以后再研究
	{
		destin++;
	}

	while ((*destin++ = *source++) != '\0');

	return temp;

}

char *mystrcpy(char *destin,const char *source)//拷贝一个字符串到另一个
{
	assert(destin != nullptr);
	assert(source != nullptr);
	char *temp = destin;
	while ((*destin++ = *source++) != '\0');

	return temp;

}

int mystrcmp(const char *str1,const char *str2)//串比较
{
	assert(str1 != nullptr);
	assert(str2 != nullptr);
	int temp = 0;
	while ((temp = (*str1-*str2)) == 0 && *str1)  //这里注意也是不能一味合并大括号里面的自增进去的
											//因为后面还要判断str1值,不能提前自增。
	{
		str1++;
		str2++;
	
	}

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

}

char *mystrchr(const char *str,const char c)//在一个串中查找给定字符的第一个匹配之处
{
	assert(str != nullptr);
	while (*str!= c)	//这里不加判断*str是因为vs2017上就不判断呀,我的实现要求就是运行结果和原函数一样
		//连报错都一样!!我目的实现了,装了逼就跑啊
	{
		str++;	 //注意这里递增也老老实实写大括号里,不要装逼写条件里,为什么,运行结果不一样啊
		//结果论就行了,我怎么知道为什么,电脑又不是我发明的
	}
	return (char *)str;


}

int my_strcmpi(const char *str1, const char *str2)//	 将一个串与另一个比较, 不管大小写
{
	assert(str1 != nullptr);
	assert(str2 != nullptr);
	char *temp1 = (char *)str1;
	char *temp2 = (char *)str2;
	int temp = 0;
	while (temp == 0 && *temp1)
	{
		if (isalpha(*temp1) && isupper(*temp1) && *temp1)
		{
			*temp1 += 32;
		}
		if (isalpha(*temp2) && isupper(*temp2) && *temp2)
		{
			*temp2 += 32;
		}
		temp = *temp1 - *temp2;
		temp1++;
		temp2++;
		
	}
	if (temp==0&&mystrlen(str1)<mystrlen(str2))	//能看懂吧,加这么段代码很重要
	{
		if (isalpha(*temp2) && isupper(*temp2))
		{
			*temp2 += 32;
		}
		temp = -*temp2;

	}
	return temp;
	




}

char *mystrstr(char *const dest, const char * const source)//在串中查找指定字符串的第一次出现
{

	assert(dest != nullptr);
	assert(source != nullptr);
	int dlength = mystrlen(dest) - mystrlen(source);
	if (dlength<0)
	{
		return nullptr;
	}

	for (size_t i = 0; i < dlength; i++)
	{
		int flag = 1;//默认存在
		for (size_t j = 0; j < mystrlen(source); j++)
		{
			if (dest[i + j] != source[j])
			{
				flag = 0; //不匹配
				break;
			}



		}
		if (flag)
		{
			return dest + i;
		}
		if (i == dlength - 1 && flag == 0)
		{
			return nullptr;


		}



	}





}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值