str的各種函數原型strcat、strcpy等

strcat與strncat原型

//////////////////////////////////////////////////////////////////////////
//功能爲連接兩個字符串,把src連接到dest後面;返回dest地址;
//////////////////////////////////////////////////////////////////////////
char* mystrcat(char* dest,const char* src)
{
	assert((dest != NULL) && (src != NULL));
	
	char* res = dest;
	while(*dest) // *dest != '\0' 
	{
		dest++;
	}
	while(*dest++ = *src++)
	{
		NULL;
	}

	return res;
}
/*
//功能爲連接兩個字符串,把src連接到dest後面;返回dest地址;
*/
char* mystrncat(char* dest,const char* src,unsigned int num)
{
	assert((dest != NULL) && (src != NULL));

	if (!num)
	{
		return dest;
	}

	char* res = dest;
	while(*dest) // *dest != '\0' 
	{
		dest++;
	}
	while(*dest++ = *src++)
	{
		if (--num == 0)
		{
			*dest = '\0';
			break;
		}
	}

	return res;
}

strchr與strrchr原型

//////////////////////////////////////////////////////////////////////////
//功能爲查找str中首次出現c的位置,如有有,則返回出現位置,否則返回NULL;
//////////////////////////////////////////////////////////////////////////
/*
const char * strchr ( const char * str, int character );
char * strchr (       char * str, int character )
*/
char* mystrchr(char* str,char c)
{
	assert(str != NULL);

	while(*str && *str != c)
	{
		str++;
	}
	if (*str == c)
		return str;

	return NULL;
}

//////////////////////////////////////////////////////////////////////////
//功能爲查找str中最後一次出現c的位置,如有有,則返回出現位置,否則返回NULL;
//////////////////////////////////////////////////////////////////////////
char* mystrrchr(char* str,char c)
{
	assert(str != NULL);
	
	char* res = str;
	while(*res++)
		;
	while((--res != str) && (*res != c))
		;
	if (*res == c)
		return res;

	return NULL;
}

strcmp與strncmp原型

//////////////////////////////////////////////////////////////////////////
//功能爲比較兩個字符串;
//當str1指向的字符串大於str2指向的字符串時,返回正數。
//當str1指向的字符串等於str2指向的字符串時,返回0。
//當str1指向的字符串小於str2指向的字符串時,返回負數。;
//////////////////////////////////////////////////////////////////////////
int mystrcmp(const char* str1,const char* str2)
{
	assert((str1 != NULL) && (str2 != NULL));

	while (*str1 && (*str1 == *str2))
	{
		str1++;
		str2++;
	}
	return *str1-*str2;
}

//////////////////////////////////////////////////////////////////////////
//功能爲比較兩個字符串前num個字符;
//當str1指向的字符串大於str2指向的字符串時,返回正數。
//當str1指向的字符串等於str2指向的字符串時,返回0。
//當str1指向的字符串小於str2指向的字符串時,返回負數。;
//////////////////////////////////////////////////////////////////////////
int mystrncmp(const char* str1,const char* str2,unsigned int num)
{
	assert((str1 != NULL) && (str2 != NULL));

	if (!num)
		return 0;

	while (--num && *str1 && (*str1 == *str2))
	{
		str1++;
		str2++;
	}
	return *str1-*str2;
}

strcpy與strncpy原型

/*
功能爲拷貝字符串內容到目的串,把src所指向的內容拷貝到dest;
*/
char* mystrcpy(char* dest,const char* src)
{
	assert((dest != NULL) && (src != NULL));

	char* res = dest;
	while(*dest++ = *src++)
	{
		NULL;
	}
	return res;
}

/*
功能爲拷貝字符串內容到目的串,把src所指向的內容的前num個字符拷貝到dest;
標準庫中返回指針不是以null即'\0'結束的,必須手動添加
*/
char* mystrncpy(char* dest,const char* src,unsigned int num)
{
	assert((dest != NULL) && (src != NULL));

	if (!num)
	{
		*dest = '\0';
		return dest;
	}

	char* res = dest;
	while(*dest++ = *src++)
	{
		if (--num == 0)
		{
			*dest = '\0';
			break;
		}
	}
	return res;
}

strspn與strcspn原型

//////////////////////////////////////////////////////////////////////////
//功能:在字符串str1中搜尋str2中所出現的字符
//說明:返回第一個出現的字符在s1中的下標值
//亦即在s1中出現而s2中沒有出現的子串的長度;
//////////////////////////////////////////////////////////////////////////
unsigned int mystrcspn ( const char * str1, const char * str2 )
{
	assert((str1 != NULL) && (str2 != NULL));
	// map有32個字節的大小,也就是256個bit,可把map堪稱一個2維數組[32][8]
	unsigned char map[32] = {0};

	// 每個ASCII碼(設爲c)有8bit,把它分成2部分,低3位構成下標j(通過c&7(2進製爲111));
	// 高5位構成下標i(通過c>>3得到)。這樣在map[i][j]中置1表示字符存在;
	while(*str2)
	{
		map[*str2 >> 3] |= (unsigned int)(1 << (*str2 & 7));
		str2++;
	}
	map[0] |= 1;

	unsigned int count = 0;
	while(!(map[*str1 >> 3] & (unsigned int)(1 << (*str1 & 7))))
	{
		count++;
		str1++;
	}

	return count;
}
//返回字符串中第一個不在指定字符串中出現的字符下標
//亦即第一個在s1中出現且s2中存在的子串的長度;
unsigned int mystrspn(char* str1,char* str2)
{
	assert((str1 != NULL) && (str2 != NULL));
	// map有32個字節的大小,也就是256個bit,可把map堪稱一個2維數組[32][8]
	unsigned char map[32] = {0};

	// 每個ASCII碼(設爲c)有8bit,把它分成2部分,低3位構成下標j(通過c&7(2進製爲111));
	// 高5位構成下標i(通過c>>3得到)。這樣在map[i][j]中置1表示字符存在;
	while(*str2)
	{
		map[*str2 >> 3] |= (unsigned int)(1 << (*str2 & 7));
		str2++;
	}
	map[0] |= 0;

	unsigned int count = 0;
	while((map[*str1 >> 3] & (unsigned int)(1 << (*str1 & 7))))
	{
		count++;
		str1++;
	}
	return count;
}

strlen原型

//////////////////////////////////////////////////////////////////////////
//功能爲返回字符串str的長度(不包括'\0');
//size_t strlen ( const char * str );
//////////////////////////////////////////////////////////////////////////
unsigned int mystrlen(const char* str)
{
	assert(str != NULL);
	unsigned int len = 0;
	while(*str++)
	{
		len++;
	}
	return len;
}

strstr原型

//需找str字符串中出現strSearch字符串位置的指針。如果沒找到,則返回NULL,如果strSearch爲空,則返回str;
char* mystrstr(char* str,char* strSearch)
{
	/*
	int length1=strlen(str);  
	int length2=strlen(strSearch);  
	while(length1>=length2)  
	{  
		length1--;  
		if(!mystrncmp(str,strSearch,length2))//比較前n個字符串;
			return str;  
		str++;  
	}  
	return NULL; 
	*/
	char* b = strSearch;
	if( *b == NULL )
	{
		return str;
	}
	
	char* a = NULL;
	for( ; *str != NULL; str++) 
	{
		if( *str != *b ) 
		{
			continue;
		}

		a = str;
		while(1) 
		{
			if( *b == NULL ) 
			{
				return str;
			}
			if( *a++ != *b++ ) 
			{
				break;
			}
		}

		b = strSearch;
	}

	return NULL;
}

strpbrk

//在源字符串(str1)中找出最先含有搜索字符串(str2 )中的任一字符的位置並返回,若找不到則返回空指針;
//與mystrnspn的算法一樣,只是前者返回相同字符的指針位置,後者返回相同字符的個數;
char* mystrpbrk(char* str1,char* str2)
{
	assert((str1 != NULL) && (str2 != NULL));
	// map有32個字節的大小,也就是256個bit,可把map堪稱一個2維數組[32][8]
	unsigned char map[32] = {0};

	// 每個ASCII碼(設爲c)有8bit,把它分成2部分,低3位構成下標j(通過c&7(2進製爲111));
	// 高5位構成下標i(通過c>>3得到)。這樣在map[i][j]中置1表示字符存在;
	while(*str2)
	{
		map[*str2 >> 3] |= (unsigned int)(1 << (*str2 & 7));
		str2++;
	}
	map[0] |= 1;

	while(*str1)
	{
		// 如果有相同的字符則返回;
		if( map[*str1 >> 3] & (1 << (*str1 & 7)) )
			return str1++;

		str1++;
	}

	return NULL;
}



經過一天的奮鬥,終於將這些理清楚了。再接再厲!
這些經常出現在面試題中,不能再輸在這上面了













發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章