【strlen】
返回字符串的长度,不包括‘\0’
//变量计数器
int my_strlen(const char* str)
{
int count = 0;
while (*str)//遍历一遍字符串,走一个,计数器加一
{
count++;
str++;
}
return count;
}
//不创建变量计数器(递归)
int my_strlen(const char* str)
{
if (*str == '\0')
return 0;
else
return 1 + my_strlen(str + 1);//递归往今走一步,加一
}
//指针
int my_strlen(char *s)
{
char *p = s;
while (*p != '\0')//也是遍历字符串
p++;
return p - s;
}
【strcpy】
不会拷贝’\0’
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;
assert(dest);
assert(src);
while ((*dest++ = *src++))//两个都是先解以用再++。到了'\0',赋值之后判断结束循环
{
;
}
return ret;
}
【strcat】
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;
assert(dest);
assert(src);
while (*dest)//到'\0'
{
dest++;
}
while ((*dest++ = *src++))
{
;
}
return ret;
}
【strstr】
看是不是子串,是返回其位置
char* my_strstr(const char* str1, const char* str2)
{
assert(str1);
assert(str2);
char *cp = (char*)str1;
char *substr = (char *)str2;
char *s1 = NULL;
if (*str2 == '\0')
return NULL;
while (*cp)
{
s1 = cp;
substr = str2;
while (*s1&&*substr && (*s1 == *substr))
{
s1++;
substr++;
}
if (*substr == '\0')
return cp;
cp++;
}
}
【strcmp】
int my_strcmp(const char* src, const char* dst)
{
int ret = 0;
while (!(ret = *(unsigned char *)src - *(unsigned char*)dst) && *dst)
{
++src;
++dst;
}
if (ret < 0)
ret = -1;
else if (ret>0)
ret = 1;
return(ret);
}
【memmove】
内存copy
void* memcpy(void *dst, const void *src, size_t count)
{
void *ret = dst;
while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return(ret);
}
【memmove】
void *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 - 1;
src = (char *)src - 1;
while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}
}
return(ret);
}
如果有不对的地方,可以评论告诉我,望指导!