我们库函数中提供给我们很多函数,我们虽然不需要自己去实现这些函数,但是我认为自己亲自去实现一下这些函数对我们有很大的好处。
我们可以根据自己的想法实现这些函数的功能,然后再看一下库里面是怎么实现它们的,比较一下,看看函数的实现方式的异同之处,这样我们可以找出自己的不足之处,学习库函数的实现思维,帮助我们提升编程能力。
下面是一些函数的实现:
strstr函数的实现:
char *my_strstr(const char *str1, const char *str2)
{
assert(str1);
assert(str2);
char *pstr1 = str1;
char *p1 = NULL;
char *p2 = NULL;
while (*pstr1)
{
p1 = pstr1;
p2 = str2;
while ((*p1) && *p1 == *p2)
{
p1++;
p2++;
if (*p2 == '\0')
return pstr1;
}
pstr1++;
}
return NULL;
}
strcpy的实现:
char *my_strcpy(char *dst, const char *src)
{
assert(dst);
assert(src);
char *ret = dst;
while (*dst++ = *src++)
{
;
}
return ret;
}
strcat函数:
char *my_strcat(char *dest, const char *src)
{
assert(dest);
assert(src);
char *ret = dest;
while (*dest)
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
strcmp函数:
int my_strcmp(const char *str1, const char *str2)
{
assert(str1);
assert(str2);
while (*str1 == *str2)
{
if (*str1=='\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
strlen函数在上一篇博客中,(strlen的三种实现方法)
memcpy函数:
void* my_memcpy(void *dest, const void *src,int size)
{
assert(dest);
assert(src);
void *ret = dest;
char *p1 = (char *)dest;
char *p2 = (char *)src;
while (size--)
{
*p1++ = *p2++;
}
return ret;
}
memmove函数:
void* my_memmove(void *dest, void const *src, int count)
{
assert(dest);
assert(src);
void *ret = dest;
char *p1 = (char *)dest;
char *p2 = (char *)src;
if (p1 > p2 && p1 < p2 + count)
{
while (count--)
{
*(p1 + count) = *(p2 + count);
}
}
else
while (count--)
{
*p1++ = *p2++;
}
return ret;
}