memcpy
memcpy为内存拷贝函数,拷贝方式为按字节拷贝。注意 目标字符串和原字符串不能有重叠。对于需要对有重叠的内存块进行拷贝时应使用memmove函数
void* my_memcpy(void*des, const void* sour, size_t n)
{
assert(des&&sour);
void* ret = des;
while (n--)
{
*((char*)des)++ = *((char*)sour)++;
}
return ret;
}
strstr
strstr函数作用是返回字符串中首次出现子串的地址。
char* my_strstr(char* str1, const char* str2)
{
assert(str1&& str2);
char* p1 = NULL;
const char* p2 = NULL;
char* p = str1;
while (p)
{
p1 = p;
p2 = str2;
while (*p1 != '\0'&&*p2 != '\0'&&*p1 == *p2)
{
p1++;
p2++;
}
if (*p2 == '\0')
return p;
p++;
}
return NULL;
}
strcat
函数的功能是将两个char类型连接。destination和source所指内存区域不可以重叠且destination必须有足够的空间来容纳source的字符串。
char * my_strcat(char * destination, const char * source)
{
assert(destination);
char* ret = destination;
//走到\0
while (*destination++);
while (*destination++ = *source++);
return ret;
}
strcmp
strcmp为字符串比较函数 当两个函数相等时返回0,当函数返回值大于0时,str1>str2,当函数返回值小于0时,str1<str2;
比较方法为比较对应位置字母的ASCII的大小。
int my_strcmp(const char* str1, const char*str2)
{
assert(str1&& str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
strcpy
strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
char* my_strcpy(char* des, const char* sour)
{
char* ret = des;
assert(des&&sour);
while (*des++ = *sour++);
return ret;
}
strlen
strlen函数为求字符串的长度,求的是字符串中\0之前的字符个数。
size_t my_strlen(const char* str)
{
assert(str);
size_t count = 0;
while (*str++)
{
count++;
}
return count;
}
memmove
memmove可以对任意类型的数据进行拷贝,支持重叠拷贝。
void* my_memmove(void *dest, const void *src, size_t count)
{
assert(dest&&src);
if (dest <= src)
{
while (count--)
{
*((char*)dest)++ = *((char*)src)++;
}
}
else
{
//倒着拷贝
(char*)dest += count - 1;
(char*)src += count - 1;
while (count--)
{
*((char*)dest)-- = *((char*)src)--;
}
}
}