C++ 实现strlen,strcpy,strcat等函数

通过实现这些函数,让我明白写一个简单的函数其实也要考虑一些问题的,最基本的函数参数的合法性,使用全局变量,全局函数等的合法性。而且写代码时要细心,for循环语句中,循环次数很容易搞错,导致数组操作越界或指针访问越界。

 

strlen的实现:

size_t myStrlen(const char *str)
{
	assert(str !=NULL);
	size_t len=0;
	while((*str++) !='\0')
	{
		++len;
	}
	return len;
}


strcpy的实现:

char *myStrcpy(char *strDest, const char *strSrc)
{
	assert((strDest !=NULL) && (strSrc !=NULL));
	char* p=strDest;
	while((*strDest++ = *strSrc++) !='\0');
	return p;
}

strncpy的实现:

char* strncpy(char* strDest,const char* strSource,size_t count)
{
	assert((strDest !=NULL)&&(strSource !=NULL));
	char* p=strDest;
	while(count &&(*strDest++=*strSource++))  /* copy string */ 
		--count;
	if(count !=0)  /* pad out with zeroes */ 
		while(--count)
			*strDest++='\0';
	return p;
}



strcmy的实现:

int myStrcmp(const char *str1, const char *str2)
{
	assert((str1 != NULL) && (str2 != NULL));  
    //循环找到第一个不相等的字符   
    for (; *str1 == *str2; ++str1,++str2)  
    {  
        if (*str1 == '\0')  
        {  
            return 0;  
        }  
    }  
    return *(unsigned char*)str1 - *(unsigned char*)str2 >0 ? 1:-1;  
}


strcat的实现:

char* myStrcat(char *str1, const char *str2)
{
	assert((str1 !=NULL) && (str1 !=NULL));
	char* p=str1;
	while((*str1++) !='\0');
	--str1;
	for(; *str2 !='\0'; ++str1,++str2)
	{
		*str1=*str2;
	}
	*str1='\0';
	return p;
}


 


 


atoi的实现:

int atoiTest(const char* s)   
{   
	assert(s !=NULL);
	int i = 0,sum = 0,sign;    
	//输入的数前面可能还有空格或制表符应加判断   
	while(' '==s[i] || '/t'==s[i])   
	{   
		++i;   
	}   
	sign = ('-'==s[i])? -1:1;   
	if('-'==s[i] || '+'==s[i])   
	{   
		++i;   
	}   
	while(s[i] >= '0' && s[i] <= '9')
	{
		sum = s[i]-'0' +sum*10;   
		++i;  
	}
	return sign*sum;   
}   


 


 itoa的实现:

char* itoaTest(int num,char* buf,int radix)
{
	assert(buf !=NULL);
	int sign,digval;
	char* p=buf;
	sign=(radix==10 && num<0);
	if (sign)
	{
		*p++='-';
		num =-num;
	}
	do 
	{
		digval=num % radix;
		num /= radix;
		if(digval >9)
		{
			*p++ =digval -10 + 'a';
		}
		else
		{
			*p++ =digval + '0';
		}
	}while(num >0);
	*p-- = '\0';

	char* q=buf;
	if(sign)
	{
		++q;
	}

	char temp;
	while(q<p)
	{
		temp=*q;
		*q=*p;
		*p=temp;
		++q;
		--p;
	}
	return buf;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值