我们库函数中提供给我们很多函数,我们虽然不需要自己去实现这些函数,但是我认为自己亲自去实现一下这些函数对我们有很大的好处。

我们可以根据自己的想法实现这些函数的功能,然后再看一下库里面是怎么实现它们的,比较一下,看看函数的实现方式的异同之处,这样我们可以找出自己的不足之处,学习库函数的实现思维,帮助我们提升编程能力。

下面是一些函数的实现:

 

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;
}