模拟实现strlen
方式1
int my_strlen(const char *str)
{
int count = 0;
while(*str)
{
count++;
str++;
}
return count;
};
方式2
//不能创建临时变量计数器
//用递归
int my_strlen(const char *str)
{
if(*str == '\0')
return 0;
else
return 1+my_strlen(str+1);
}
方式3
//不能创建临时变量计数器
//用指针-指针的方式
int my_strlen(const char *str)
{
const char *p = str;
while(*p != '\0')
p++;
return p-str;
}
模拟实现strcpy
char *my_strcpy(char *dest, const char *src)
{
assert(dest != NULL);
assert(src != NULL);
char *ret = dest;
while(*dest = *src)
{
dest++;
src++;
}
/*或者
while (*dest++ = *src++);
*/
return ret;
}
模拟实现strcat
char *my_strcat(char *dest, const char *src)
{
assert(dest != NULL);
assert(src != NULL);
char *ret = dest;
while(*dest)
dest++;
while(*dest++ = *src++);
return ret;
}
模拟实现strstr
char *my_strstr(const char *str1, const char *str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
char *cp = (char *)str1;//str1外循环,其实没必要定义cp变量,直接用str1就行了。
char *substr = (char *)str2;
char *s1 = NULL;//str1内循环
if(*str2 == '\0')
return NULL;
while(*cp)
{
s1 = cp;
substr = (char *)str2;
while(*s1 && *substr && (*s1 == *substr))
{
s1++;
substr++;
}
if(*substr == '\0')
return cp;
cp++;
}
return NULL;
}
//上三处的强转其实也都没有必要,直接把cp和substr定义成const char *的就可以了。
//为了“见识”,所以使用了强转。
模拟实现memcpy
void *my_memcpy(void *dest, const void *src, size_t count)
{
assert(dest != NULL);
assert(src != NULL);
void *ret = dest;
while(count--)
{
*(char *)dest = *(char *)src;
dest = (char *)dest + 1;
src = (char *)src + 1;
}
return ret;
}
模拟实现memmove
void *my_memmove(void *dest, const void *src, size_t count)
{
assert(dest != NULL);
assert(src != NULL);
void *ret = dest;
if(dest > src && ( (char *)src + count > dest) )
{
dest = (char *)dest + count -1;
src = (char *)src + count - 1;
while(count--)
{
*(char *)dest = *(char *)src;
dest = (char *)dest - 1;
src = (char *)src - 1;
}
}
else
{
while(count--)
{
*(char *)dest = *(char *)src;
dest = (char *)dest + 1;
src = (char *)src + 1;
}
}
return ret;
}