1. 程式人生 > >常見幾個字串函式實現程式碼

常見幾個字串函式實現程式碼

(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);
}