str-和mem-的一些库函数的练习
1.实现strcpy
char* my_strcpy(char* dest, const char* src)
{
assert(dest);
assert(src);
char* tmp = dest;
while ((*dest++ = *src++) != '\0')
;
return tmp;
}
2.实现strcat
char* my_strcat(char* dest, const char* src)
{
assert(dest);
assert(src);
char* tmp = dest;
while (*dest != '\0')
{
dest++;
}
while ((*dest++ = *src++) != '\0')
;
return tmp;
}
3.实现strstr
char* my_strstr(const char* dest, const char* src)
{
assert(dest);
assert(src);
char* sub_str = (char*)src;//需要三个字符指针
char* str = (char*)dest;
char* pstr = NULL;
while (*str)
{
pstr = str;
sub_str = src;
while (*pstr++ = *sub_str++)
;
if (*sub_str == '\0') //找到子串
{
return pstr;
}
str++; //找不到就从下一个字符开始
}
}
4.实现strcmp
int * my_strcmp(const char* str1, const char* str2)
{
assert(str1);
assert(str2);
char* p1 = (char*)str1;
char* p2 = (char*)str2;
while (*p1 && *p2)
{
if (*p1++ == *p2++)
{
return 0;
}
else if (*p1 > *p2)
{
return 1;
}
else if (*p1 > *p2)
{
return -1;
}
}
}
5.实现memcpy
void* my_memcpy(void* dest, const void* src,int sz)
{
assert(dest);
assert(src);
void *ret = dest; //返回的字符串
char *d = (char*)dest;
char *s = (char*)src;
while (sz--)
{
*d++ == *s++;
}
return ret;
}
6.实现memmove
与memcpy不同的是,它可以处理内存重叠的问题,而内存重叠又大体分为两种,把要复制的向左复制和向右复制。当dest的首元素<src的首元素或者dest的首元素大于整个src的地址,就应当从左向右复制,反之。
- 向左
- 向右
void* my_memcpy(void* dest, const void* src, int sz)
{
void* ret = dest;
char *d = (char*)dest;
char *s = (char*)src;
//分两种情况,向左和向右
if (dest <= src || d >= s + sz)
{
while (sz--)
{
*d++ == *s++;
}
}
else
{
d = d + sz-1; //d[sz-1]->第sz个元素
s = s + sz-1;
while (sz--)
{
*d-- == *s--;
}
}
return ret;
}
7.实现memset
void * memset(void *dest, int c, size_t count)
{
assert(dest);
while (count--)
{
*(char*)dest = c;
dest = (char*)dest+1;
}
}