天天看點

C語言中部分庫函數的實作

strlen的實作:

該函數的作用是:

strlen所作的是一個計數器的工作,它從記憶體的某個位置(可以是字元串開頭,中間某個位置,甚至是某個不确定的記憶體區域)開始掃描,直到碰到第一個字元串結束符'\0'為止,然後傳回計數器值(長度不包含'\0')。

也就是計算給定字元串的長度

int my_strlen(const char* a,int len) 
{
	while (*a != '\0') 
	{
		len++;
		a++;
	}
	return len;
}

int main() 
{
	char a[] = "my little world";
	int len = 0;
	my_strlen(a, len);
	int ret = my_strlen(a, len);
	printf("%d", ret);
}
           

ps在此處const的作用是:

在const修飾指針變量的時候:

1.const如果放在*的左邊,修飾的是指針指向的内容,保證指針的内容不能通過指針來改變,但是指針變量本身的内容可變。

2.const如果放在*的右邊,修飾的是指針變量本身,保證了指針變量的内容不能修改,但是指針隻想的内容,可以通過指針改變。

strcpy的實作:

該函數的作用是:

strcpy把含有'\0'結束符的字元串複制到另一個位址空間,傳回值的類型為char*

也就是字元串複制

char* my_strcpy(char* str1, char* str2) 
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	char* temp = str1;
	while (*str1++ = *str2++)      //将str2的内容複制到str1
	{

	}
	return temp;
}

int main() 
{
	char arr1[20] = "hello";
	char arr2[20] = "my little world";
	char *test = my_strcpy(arr1, arr2);
	printf("%s", test);

}
           

strcat的實作:

該函數的作用是:

将兩個char類型連接配接

char* mystrcat(char* dest, const char* src) 
{
	assert(dest != NULL);
	assert(src != NULL);
	char* arc = dest;
	while (*dest) 
	{
		dest++;
	}
	while (*dest++ = *src++) 
	{
		;
	}
	return arc;
}
           

strcmp的實作:

該函數的作用是:

用于比較兩個字元串并根據比較結果傳回整數。基本形式為strcmp(str1,str2),若str1=str2,則傳回零;若str1<str2,則傳回負數;若str1>str2,則傳回正數。

也就是比較字元串s1和s2

int mystrcmp(char*dest,char*src) 
{
	int ret = 0;
	assert(dest != NULL);
	assert(src != NULL);
	while (!(ret = *(unsigned char*)src - *(unsigned char*)dest) && *dest) 
	{
		src++;
		dest++;
	}
	if (ret < 0) 
	{
		ret = -1;
	}
	else if (ret > 0) 
	{
		ret = 1;

	}
	return ret;
}
           

memcpy的實作

該函數的作用是:

memcpy指的是C和C++使用的記憶體拷貝函數,函數原型為void *memcpy(void *destin, void *source, unsigned n);函數的功能是從源記憶體位址的起始位置開始拷貝若幹個位元組到目标記憶體位址中

也就是拷貝n個位元組

void* mymemcpy(void* dst, void* src, size_t count) 
{
	assert(dst != NULL);
	assert(src != NULL);
	void* p = dst;
	while (count != 0) 
	{
		*(char*)dst = *(char*)src;
		src = (char*)src+1;
		dst = (char*)dst+1;
		count--;
	}
	return p;
}
           

strstr函數的實作:

該函數的作用是用于判斷字元串str2是否是str1的子串。如果是,則該函數傳回str1字元串從str2第一次出現的位置開始到str1結尾的字元串;否則,傳回NULL

char* mystrstr(const char* str1, char* str2) 
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	char* cp = (char*)str1;
	char* substr = (char*)str2;
	char* s1 = NULL;
	if (*str2 == '\0') 
	{
		return NULL;
	}
	while (*cp)
	{

		s1 = cp;
		substr = str2;
		while (*s1 && *substr && (*s1 == *substr)) 
		{
			s1++;
			substr++;
		}
		if (*substr == '\0') 
		{
			return cp;
			cp++;
		}
	}
}
           

繼續閱讀