模拟实现strlen:
//方法1:计数器方式
int my_strlen(const char *str)
{
int count = 0;
assert(str);
while (*str)
{
++count;
++str;
}
return count;
}
//方法2:不能创建零时变量计数器
int my_strlen(const char *str)
{
assert(str);
if (*str == '\0')
return 0;
else
return my_strlen(str+1) + 1;
}
//方法3:指针-指针的方式
int my_strlen(const char *str)
{
const char *p = str;
assert(str);
while (*p != '\0')
++p;
return p - str;
}
模拟实现strcpy:
char* my_strcpy(char *dest, const char *src)
{
char *ret = dest;
assert(dest && src);
while (*dest++ = *src++)
{
;
}
return ret;
}
模拟实现strcat:
char* my_strcat(char *dest, const char *src)
{
char *ret = dest;
assert(dest && src);
while (*dest)
{
++dest;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
模拟实现strcmp:
int my_strcmp(const char *str1, const char *str2)
{
int ret = 0;
assert(str1 && str2);
//在两个字符串相等的时候需要str1来判断结束
while (!(ret = *str1 - *str2) && *str1)
++str1, ++str2;
if (ret < 0)
return -1;
else if (ret > 0)
return 1;
else
return ret;
}
模拟实现strstr:
const char* my_strstr(const char* src, const char* sub)
{
const char *bp;
const char *sp;
const char *s1 = NULL;
assert(src && sub);
if (*sub == '\0')
return NULL;
//遍历src字符串
while (*src)
{
//用来遍历子串
bp = src;
sp = sub;
do
{
//到了sub的结束位置,返回src位置
if (!*sp)
return src;
}while(*bp++ == *sp++);
++src;
}
return NULL;
}
模拟实现memcpy:
void* my_memcpy(void *dst, const void* src, size_t count)
{
void *ret = dst;
assert(dst && src);
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
return ret;
}
模拟实现memmove:
void* my_memmove(void *dst, const void* src, size_t count)
{
void *ret = dst;
if (dst<=src || (char*)dst>=((char*)src+count))
{
//目标地址小于源地址或者不相交,从低地址往高地址
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
}
else
{
dst = (char*)dst + count - 1;
src = (char*)src + count - 1;
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst - 1;
src = (char*)src - 1;
}
}
return ret;
}