常见库函数的模拟

本文只列举出常见的7个库函数的模拟,如果有错误或者有问题,可以联系博主,欢迎指导。


1.模拟实现strlen(求字符串长度)

(1)
int my_strlen(const char *p)//计数器的方式 { int count = 0; assert(p != 0); while (*p != '\0') { count++; p++; } return count; }
(2)

my_strlen(const char *str) //指针的方式

{
const char *start = str;
while (*str != '\0')
{
str++;
}
return str - start;
//为了简洁也可以用下面这种方式
        /*while (*str++)
{
;
}
return str - start-1;*/
}
(3)
my_strlen( const char *p)//函数递归的方式
{
assert(p != 0);
if (*p == '\0')
return 0;
else
{
return 1+my_strlen(p+1);
}
}
int main()
{
int len = my_strlen("abcdef");
printf("%d\n", len);
return 0;
}

2.模拟strcat --  字符串追加函数

char* my_strcat(char *dest, const char *src)
{
	 assert(dest != NULL);
	 assert(src != NULL);
	 char *ret = dest;
	 while (*dest != '\0')
		 dest++;
	 while (*dest++ = *src++)
		 ;
	 return ret;
}
int main()
{
	char arr[20] = "hello ";
	my_strcat(arr, "world");
	printf("%s\n", arr);
	return 0;
}

3.模拟实现字符串拷贝函数strcpy


char* my_strcpy(char *dest,const char *src)//目标指针
//char* 链式访问  把一个函数的返回值作为另一个函数的参数
{
	char*ret = dest;
	assert(dest != null);//断言
	assert(src != null);//断言
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr[10] = "abcdefghi";
	//strcpy(arr, "hello");
	char *p = null;
	printf("%s\n", my_strcpy(arr, "hello"));
	return 0;
}

4.模拟实现strstr函数--- 从一个字符串里找另一个字符串

my_strstr(const char*str, const char*substr)
{
	assert(str != NULL);
	assert(substr != NULL);
	const char *s1;
	const char *s2;
	while (*str != '\0')
	{
		s1 = str;
		s2 = substr;
		if (*substr =='\0')
			return (char *)str;
		while (*s1 && *s2 &&*s1 == *s2)
		{
			s1++;
			s2++;
		} 
		if (*s2 == '\0')
		{
			return (char *)str;
		}
		str++;
	}
	return NULL;
}
int main()
{
	char arr1[10] = "abbbcde";
	char arr2[10] = "bcdf";
	char* ret=my_strstr(arr1, arr2);
	if (ret !=NULL  )
		printf("找到了:%s\n",ret);
	else 
		printf("没找到\n");
	return 0;
}
5.模拟实现strcmp函数--- 字符串比较
my_strcmp(const char *str1, const char *str2) { assert(str1 != NULL); assert(str2 != NULL); while (*str1 == *str2) { if (*str1 == '\0') { return 0; } str1++; str2++; } if (*str1 > *str2) return 1; else return -1; //或者不用输出正负1,只需要知道正负,可以直接输出正负数,则可以简化如下
// return *str1-*str2; } int main() { char *str1 = "abdsdafad"; char *str2 = "abdsdafa"; int ret = my_strcmp(str1, str2); printf("%d\n", ret); return 0; }

6.模拟memcpy函数--内存拷贝

void* my_memcpy(void *dest, const void *src, int count)
{
	void *ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while (count--)
	{
		*(char*)dest = *(const char*)src;
		++(char*)dest; 
		++(char*)src;
	}
	return ret;
}
int main()
{
	char arr1[10] = { 0 };
	char arr2[20] = "abcdfef";
	int arr4[10] = { 0 };
	int arr3[10] = { 1,23,45,68,99 };
	my_memcpy(arr2, arr1, 10);
	my_memcpy(arr4, arr3, 40);
	return 0;
}

7.模拟memmove函数--内存拷贝(专门处理重叠的情况)


 
  
void my_memmove(void *dest, const void*src, int count) {
        assert(dest!=NULL);
        assert(src!=NULL); if (dest < src) { //左->右 while (count--) { *(char *)dest = *(char*)src; ++(char *)dest; ++(char *)src; } } else { //右->左 while (count--) { *((char*)dest + count) = *((char*)src + count); } } } int main() { int arr1[10] = { 1, 2, 3, 4, 5, 7, 8, 9, 0 }; my_memmove(arr1+4, arr1 , 16); return 0; }
如果还有不理解的地方,可以联系博主,或者可以打开原始库函数,了解源库函数的过程,以加深了解。





猜你喜欢

转载自blog.csdn.net/humeapz/article/details/80202855
今日推荐