strlen函数
szie_t strlen(const char* str)
计算str字符串的长度
注意:
- 字符串以‘\0’为结束标志,strlen返回的是字符串中‘\0’之前的字符个数(不包括’\0’)
- 函数返回值为size_t,是无符号的
模拟实现:
size_t my_strlen(const char* str)
{
assert(str);
char* str1 = str;
while (*str != '\0')
{
++str;
}
return str - str1;
}
strcpy函数
char* strcpy(char* dest, const char* src)
将字符串src拷贝到dest
注意:
- 会将原字符串的‘\0’拷贝到目标空间
- 原字符串必须以‘\0’结束
- 目标空间必须足够大,且可变
模拟实现:
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);
char* str = dest;
while(*dest++ = *src++);
return str;
}
strcat函数
char* my_strcat(char* dest, const char* src)
拼接字符串dest和src,返回dest的起始地址
注意:
- 原字符串必须以‘\0’结束
- dest字符串的‘\0’会被覆盖掉,在连接狗会在字符串的最后加上‘\0’
- 目标空间必须足够大,且可变
模拟实现:
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* str = dest;
while (*dest)
{
++dest;
}
while (*dest++ = *src++);
return str;
}
strcmp函数
int my_strcmp(const char* str1, const char* str2)
比较字符串str1和str2的大小
注意:
- str1 > str2,返回大于0的数字
- str1 = str2,返回0
- str1 < str2,返回小于0的数字
模拟实现:
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
int ret = 0;
while (!(ret = *(unsigned char *)str1 - *(unsigned char *)str2) && *str2)
//当str1与str2中有一个结束时,则循环必定结束,所以只需要判断一个就可以
{
++str1;
++str2;
}
if (ret > 0)
return 1;
else if (ret < 0)
return -1;
else
return 0;
}
strstr函数
char* my_strstr(const char* str1, const char* str2)
查找字符串str2在str1中首次出现的位置,并返回该地址
模拟实现:
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
char* s = NULL;
char* cp = (char*)str1;
char* substr = (char*)str2;
if (*str2 == '\0')
return NULL;
while (*cp)
{
s = cp;
substr = str2;
while (*s && *substr && (*s == *substr))
{
++s;
++substr;
}
if (*substr == '\0')
return cp;
++cp;
}
return NULL;
}
memcpy函数
void* my_memcpy(void* dest, const void* src, size_t n)
拷贝src的前n个字节的数据到dest上
注意:
- 这个函数遇到‘\0’时不会停下来
- 如果dest和src的内存有重叠,则结果不可知
- n为字节数,而不是数据个数
模拟实现:
void* my_memcpy(void* dest, const void* src, size_t n)
{
assert(dest && src);
void* ret = dest;
char* str1 = (char*)dest;
char* str2 = (char*)src;
while (n--)
{
*str1++ = *str2++;
}
return ret;
}
memmove函数
void* my_memmove(void* dest, const void* src, size_t n)
作用与memcpy相同,但是可以处理dest和src内存重叠的情况
注意:
- 使用情况为dest和sec存在内存重叠
- n为字节数,而不是数据个数
模拟实现:
void* my_memmove(void* dest, const void* src, size_t n)
{
assert(dest && src);
char* str1 = (char*)dest;
char* str2 = (char*)src;
if ((str1 > str2) && (str1 < str2 + n))
{
while (n--)
{
*(str1 + n) = *(str2 + n);
}
}
else
{
while (n--)
{
*str1++ = *str2++;
}
}
return dest;
}