1. 程式人生 > >總結與字串有關的模擬實現函式程式碼

總結與字串有關的模擬實現函式程式碼

1.strcpy實現字串的拷貝

char* my_strcpy(char* dest,const char* src)

{

	char* temp = dest;

	assert(src != NULL);

	while(*dest++ = *src++)

	{

		;

	}

	return temp;

}

2.strcat實現字串的連線

char* my_strcat(char* arr,const char* src)

{

	char* temp = arr;

	assert(src != NULL);

	while(*arr != '\0')

	{

		arr++;

	}

	while(*arr++ = *src++)

	{

		;

	}

	return temp;

}

3.strstr實現子字串在目標字串中的查詢

char* my_strstr(const char* dest,const char* src)//函式返回找到目標開始匹配且成功的起始位置

{

	const char* s1 = dest;//定義s1讓dest備份

	const char* s2 = src;

	const char* ptr = dest;

	assert(src != NULL);



	while(*ptr)//ptr++尋找開始匹配的位置

	{

		s1 = ptr;//記住開始匹配的位置

		s2 = src;//記住子字串開始的位置

		while(*s1 && *s2 && *s1 == *s2)//有一個條件為假結束

		{

			s1++;

			s2++;

		}

		if(*s2 == '\0')//當s2說明匹配成功 返回目標字串的開始位置

			return (char*)ptr;

		ptr++;//假設開始匹配卻未匹配成功*ptr沒有成為'\0'時,ptr加加開始下一輪查詢

	}

	return NULL;//沒有找到時返回空指標



}

4.strcmp實現字串的比較

int my_strcmp(const char* dest,const char* src)

{

	assert(dest != NULL);//判斷傳過來的指標是不是為空

	assert(src != NULL);

	while(*dest == *src)//當src為'\0'時結束,但他的值賦給了dest,

		//所以在迴圈內部返回0;然後跳出迴圈

	{

		if(*dest == '\0')

		{

			return 0;

		}

		dest++;src++;

	}

	if(*dest > *src)//不要把判斷寫在if之後,因為當dest為0時程式沒有機會來到最後

	{

		return -1;

	}

	else

	{

		return 1;

	}

}

5.memcpy(也同時實現了memmove)記憶體的字元拷貝

void* my_memcpy(void* dest,const void* src,int count)

{

	void* temp = dest;

	assert(dest != NULL);

	assert(src != NULL);

	while(count--)

	{

		if(src < dest)//不判斷指標的大小即是memcpy,判斷指標大小函式便成為了memmove函式。

		*((char*)dest+1) = *((char*)src+1);

		//((char*)dest)++;

		//((char*)src)++;

		else

		{

			*((char*)dest+count) = *((char*)src+count);

		}

	}

	return temp;

}

6.strchr在目標字串中查詢字元

char* my_strchr(const char* dest,const char* src)

{	

	while(*dest)

	{	

		if(*dest == *src)

			return dest;

		dest++;

	}

	return NULL;

	

}

7.strncpy自己定義要拷貝的字串長度

char* my_strncpy(char* dest,const char* src,int count)

{

	char* ret = dest;	

	assert(src != NULL);

	while(count--)//count來控制迴圈次數

	{

		*dest++ = *src++;		

	}

	*dest = '\0';//當賦值結束時應當讓目標字串以‘\0’結束

	return ret;

}

8.strncmp自己定義需要比較的字串長度

int my_strncmp(const char* dest,const char* src,int count)

{

	assert(dest != NULL);

	assert(src != NULL);

	while((*dest == *src) && --count)//必須同時滿足倆個條件時才滿足

	{

		if(*dest == '\0')//如果*dest為0,說明*src已經結束返回0

			return 0;

		dest++;

		src++;

	}

	return *src-*dest;//直接返回比較結果數字
	
}

9.strncat自己定義需要連線字串的長度

char* my_strncat(char* dest,const char* src,int count)

{

	

	char* ret = dest;//儲存dest的起始位置

	if(count < 0)

		return NULL;//判斷假如count輸入為負數時

	assert(src != NULL);

	while(*dest != '\0')

	{

		dest++;

	}

	while(count--)

	{

		*dest++ = *src++;		

	}

	*dest = '\0';//當賦值結束時應當讓目標字串以‘\0’結束

	return ret;

}