自定义字符串函数(长度,复制,连接,比较,反序,atoi,itoa)

求字符串长度strlen——Mystrlen

int Mystrlen(char *des)
{
	int count = 0;                                               //计算器
	for(int i=0;*(des+i)!='\0';i++)
	{
		count++;
	}
	return count;
}

字符串复制strcpy——Mystrcpy

void Mystrcpy(char des[],char src1[])       //复制str1到str2
{
	int i;
	for(i=0;src[i]!='\0';i++)
	{
		des[i] = src[i];
	}
	str2[i] = '\0';
}

进阶:指针

void Mystrcpy1(char *des,const char *src)
{
	int i;
	for(i=0;*(src+i)!='\0';i++)
	{
		*(des+i) = *(src+i);
	}
		*(des+i) = '\0';
}
void Mystrcpy2(char *des,const char *src)
{

while(*src!='\0')
    {
	   *des = *src;
		src++;
		des++;
    }
		*des= '\0';
}

经典代码

技巧:1.赋值的定义:将等式右边的值作为整个表达式的值
2.优先级
3.空语句;
4.后置++
5.利用非0为真,0为假使循环继续或停止

void Mystrcpy(char *des,const char *src)
{
	while(*des++ = *src++);
}

加入断言

void Mystrcpy(char *des,const char *src)
{
	assert(des!=NULL && src!=NULL);
	if(des==NULL || src==NULL)
	{
		return ;
	}

	while(*des++ = *src++);
}

字符串连接strcat——Mystrcat

void Mystrcat(char *des,const char *src)
{
	//找到des的尾巴
	int i;
	for(i=0;des[i]!='\0';i++)
		;//空语句

	//复制src
	for(int j=0;src[j]!='\0';j++,i++)
	{
		des[i] = src[j];
	}
	des[i] = '\0';
}

字符串比较strcmp——Mystrcmp

//比较字符串大小.str1>str2返回正数;str1==str2返回0;str1<str2返回负数
int Mystrcmp(char str1[],char str2[])
{
	int i=0;
	int d;
	for(;str1[i]||str2[i];i++)
	{
			if(str1[i] != str2[i])
		{
			d=str1[i] - str2[i];		
			break;
		}
	}
	if(str1[i] == '\0'&&str2[i] == '\0')       //比较到末尾还没break
		d=0;
	return d;
}

指针形式:

int Mystrcmp(char const *str1,char const *str2)
{
	int i=0;
	int d;
	for(i=0;*(str1+i)||*(str2+i);i++)
	{
		if(*(str1+i)!=*(str2+i))
	    {
			d=*(str1+i) - *(str2+i);
		    break;
		}
	}
	if(*(str1+i)=='\0'&&*(str2+i)=='\0')
		d=0;
	return d;
}

更简洁的版本:

nt Mystrcmp(const char *str1,const char *str2)
{
	assert(str1!=NULL && str2!=NULL);
	int tmp;//用来保存两个字符差值
	while((tmp=*str1-*str2)==0 && *str1!='\0')
	{
		str1++;
		str2++;
	}

	return tmp;
}

字符串反序

void Reverse(char *str)
{
	char *p;
	char tmp;

	for(p=str;*p!='\0';p++)//找尾巴
		;
	for(p--;str<p;str++,p--)//交换数据
	{
		tmp = *str;
		*str = *p;
		*p = tmp;
	}
}

字符串转为数字Myatoi

//将字符串转成数字 "123"->123,"123a4"->123,"a123"->0
//1.字符串最前面的空格自动忽略;
//2.能处理最前面的符号
//3.遇到非数字字符转换结束;
//4.数字超过范围,就只保留最大或者最小值
int Myatoi(const char *str)
{
	assert(str != NULL);
	int flg = 1;//符号
	int tmp = 0;

	while(*str == ' ')//1.字符串最前面的空格自动忽略
		str++;
	if(*str=='+')//2.能处理最前面的符号
		str++;
	else if(*str=='-')
	{
		flg = -1;
		str++;
	}
    while(isdigit(*str))//只处理数字字符 .'1'->1,'2'->2,'3'->3,'4'->4...  ; 'i'-'0'->i
	{//"123"->1,2,3
		tmp = tmp*10 + (*str - '0');
		str++;
	}
	return flg*tmp;
}

数字转为字符串Myitoa

//将数字转成字符串 12345->"12345"
//12345->"54321"->"12345"
void Myitoa(char *buf,int num)
{
	int i = 0;//buf的下标
	do
	{
		buf[i++] = num%10 + '0';//将个位数字转成字符,保存
		num /= 10;//丢弃个位
	}while(num != 0);
	buf[i] = '\0';
    Reverse(buf);//反转
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值