实现各种库函数。

库函数是干什么的?

库函数的实现之所以叫库函数,是因为编译软件已经写好,而在使用的时候只需要调用,引到头文件即可,但是在面试的时候,当用到库函数,比如用strlen来求字符串的长度。如果能写出自己理解的代码,往往是面试官最喜欢的。


1.实现strcpy(字符串的拷贝)

2.实现strcat(字符串的链接)
3.实现strstr(第一个字符串是否为第二个字符串的子字符串)
4.实现strchr(字符串s中首次出现字符c的位置)
5.实现strcmp(字符串的比较)
6.实现memcpy(内存拷贝)
7.实现memmove (内存拷贝(重叠区域的拷贝))

8.实现strlen(字符串的长度)

源代码:(无相应的头文件)

1.实现strcpy

char * my_strcpy(char *dest, const char *src)
{
	assert(dest);
	assert(src);
	char *ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = { 0 };
	char arr2[] = "efg";
	my_strcpy(arr1,arr2);
	printf("%s\n",arr1);
	system("pause");
	return 0;
}
2.实现strcat
char *my_strcat(char* dest, const char* src)
{
	assert(dest!=NULL);
	assert(src!=NULL);
	char *ret = dest;
	while (*dest)
	{
		dest++;
	}
	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = "abcd";
	char arr2[] = "efg";
	char* ret=my_strcat(arr1, arr2);
	printf("%s\n",ret);
	system("pause");
	return 0;
}


3.实现strstr 
char* my_strstr(const char *str1, const char *str2)
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	if (*str2 == '\0')
	{
		return str1;
	}
	while (*str1)
	{
		const char *p = str1;
		const char *q = str2;
		while (*p != '\0'&&*q != '\0' && (*p == *q))
		{
			p++;
			q++;
		}
		if (*q == '\0')
		{
			return str1;
		}
		str1++;
	}
	
	return NULL;
}
int main()
{
	char arr1[] = "abbbbcd";
	char arr2[] = "bbc";
	char *ret =my_strstr(arr1, arr2);
	printf("%s\n",ret);
	system("pause");
	return 0;
}

4.实现strchr 
char* my_strchr( char*dest, char src)
{
	char *p = dest;
	assert(dest != NULL);
	while (*p != src)
	{
		p++;
		if (*p == '\0')
		{
			return NULL;
		}
	}
	
	return p;
}
int main()
{
	char arr1[] = "abcd";
	char *ret = my_strchr(arr1, 'c');
	printf("%s\n",ret);
	system("pause");
	return 0;
}

5.实现strcmp 
int my_strcmp(const char* dest, const char*src)
{
	int ret = 0;
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest == *src)
	{
		if (*src == '\0')
		{
			return 0;
		}
		dest++;
		src++;
	}
	if (*dest > *src)
		return 1;
	else
		return -1;
}
int main()
{
	char arr1[] = "abcd";
	char arr2[] = "acaa";
	int ret=my_strcmp(arr1, arr2);
	printf("%d\n",ret);
	system("pause");
	return 0;
}

6.实现memcpy 
void *my_memcpy(void *str1, const void *str2, size_t count)
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	void *ret = str1;
	while (count)
	{
		*(char*)str1 = *(char*)str2;
		str1 = (char*)str1 + 1;
		str2 = (char*)str2 + 1;
		count--;
	}
	return ret;
}
int main()
{ 
	int arr1[9] = { 0 };
	int arr2[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	int i = 0;
    my_memcpy(arr1, arr2, 36);
	for (i = 0; i < 9; i++)
	{
		printf("%d ", arr1[i]);
	}
	
	system("pause");
	return 0;
}

7.实现memmove 
void *my_memcpy(void *str1, const void *str2, size_t count)
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	void *ret = str1;
	if (str1 > str2)
	{
		while (count)
		{
			*(char*)str1 = *(char*)str2;
			str1 = (char*)str1 + 1;
			str2 = (char*)str2 + 1;
			count--;
		}
	}
	else
	{
		while (count)
		{
			*((char*)str1 + count) = *((char*)str2 + count);
			count--;
		}
	}
	return ret;
}
int main()
{

	int arr[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	int i = 0;
	memcpy(arr + 1, arr + 2, 16);
	for (i = 0; i < 9; i++)
	{
		printf("%d ", arr[i]);
	}

	system("pause");
	return 0;
}

8.实现strlen
int  my_strlen(const char*str)
{
	int count = 0;
	assert(str!=NULL);
	while (*str != '\0')
	{
		str++; 
		count++;
	}
	return count;
}
int main()
{
	char arr[] = "abcdefg";
	int ret=my_strlen(arr);
	printf("%d\n", ret);
	system("pause");
	return 0;
}

 

 
 
 
 

猜你喜欢

转载自blog.csdn.net/oldwang1999/article/details/80215784