常见几个字符串函数实现代码

(1)size_t  strlen(const char *str);

size_t strlen(const char *str)
{
	assert(str != NULL);
	unsigned int  cnt = 0;
	while(*str++)
		++cnt;
		
	return cnt;
}

(2)char  *strcpy(char *strDest, const *strSrc)
char  *strcpy(char *strDest, const *strSrc)
{
	if(strDest == strSrc) 
		return strDest;
		
	assert( (strDest != NULL) && (strSrc != NULL));
	
	char *retAddr = strDest;
	while( *strDest++ = *strSrc++);
	return retAddr;
}

(3)char *strncpy(char *dest,const char *src, size_t cnt)

如果在src指向的数组中遇到一个空字符 '\0',则strncpy函数为dest指向的数组添加空字符直到写完n个字符的总数量。

这点与memcpy函数不同,memcpy仅是复制n个字节数据,不检查数据类型,也不添加任何字符。

char *strncpy(char *dest,const char *src, size_t cnt)
{
	
    assert((dest!=NULL)&&(src!=NULL)); 
    
    char *retAddr=dest; 


    while( cnt &&(*dest++ = *src++) )  
        cnt--;
        
    if(cnt)
    {  
        while(--cnt)  
        {  
            *dest++ = '\0';  
        }  
    }  
    return retAddr; 
}

(4)char  *strcat(char *strDes, const char *strSrc)

char *strcat(char *strDes, const char *strSrc)
{
	assert( (strDes != NULL) && (strSrc!= NULL));
	
	char *retAddr = strDes;
	while(*strDes)
		strDes++;
		
	while( *strDes++ = *strSrc++);
	
	return retAddr;
}


(5)char *strncat(char *strDes, const char *strSrc, size_t cnt);

当遇到空字符或已经复制n个字符时,复制操作结束。

注意,若已经复制n个字符,但是strSrc还没遇到结束符,此时,要在strDes后添加结束符 '\0' ;

char *strncat(char *strDes, const char *strSrc, size_t cnt)
{
	assert( (strDes != NULL) && (strSrc != NULL));
	char *retAddr = strDes;
	
	while(*strDes)
		strDes++;
		
	while(cnt--)
		if(!(*strDes++ = *strSrc++)) //注意
			return retAddr;
	
	*strDes = '\0';	
	return retAddr;
}
	

(6)int strcmp(const char *str1, const char *str2)

int strcmp(const char *str1, const char *str2)
{
	assert((str1 != NULL) && (str2 != NULL));
	
	while(*str1 && *str2 && (*str1 == *str2))
	{
		str1++;
		str2++;
	}
	return (*(unsigned char*)str1 - *(unsigned char*)str2);
}


(7)int strncmp(const char *str1, const char *str2, size_t cnt)
int strncmp(const char *str1, const char *str2, size_t cnt)
{
	assert((str1 != NULL) && (str2 != NULL));
	
	if(!cnt)
		return 0;
	
	while( --cnt && *str1 && *str2 && (*str1 == *str2) ) 或while( --cnt && *str1 && (*str1 == *str2) )
	{
		str1++;
		str2++;
	}
	
	return (*(unsigned char*)str1 - *(unsigned char*)str2);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值