字符串函数、内存操作函数的模拟实现
这里写目录标题
- 📘str
- 💶strlen - 求字符串长度
- 法一. count计数
- 法二. 递归
- 法三. 指针 - 指针
- 💶strcpy - 字符串拷贝
- 💶strcat - 字符串拼接
- 💶strcmp - 比较两个字符串
- 💶strstr - 字符串查找
- 📗mem
- 💵memcpy - 内存拷贝
- 💵memmove - (重叠)内存拷贝
- 💵memcmp - 比较
📘str
💶strlen - 求字符串长度
法一. count计数
size_t my_strlen(char* str)
{
assert(str);
unsigned int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
法二. 递归
字符串长度 = 1 + 刨去第一个字符的剩下字符串的长度
即↓
unsigned int my_strlen(char* str)
{
assert(str);
if (*str != '\0')
return 1 + my_strlen(str + 1);
else
return 0;
}
法三. 指针 - 指针
最后一个字符的地址(’ \0 ’ 的地址)- 首元素地址 = 字符串长度
unsigned int my_strlen(char* str)
{
assert(str);
char* start = str;
while (*str != '\0')//或者直接写成while (*str)
{
str++;
}
return str - start;
}
💶strcpy - 字符串拷贝
char* my_strcpy(char* arr1, const char* arr2)
{
char* sta = arr1;
assert(arr1 && arr2);
while (*arr1++ = *arr2++)
{
;
}
return sta;
}
PS: 其中while循环部分相当于:
while (*arr)
{
*arr1 = *arr2;
arr1++;
arr2++;
}
💶strcat - 字符串拼接
char* my_strcat(char* dest, const char* source)
{
assert(dest && source);
char* str = dest;
while (*dest)//不可以*dest++,否则最后会多加一次
{
dest++;
}
while (*dest++ = *source++)
{
;
}
return str;
}
💶strcmp - 比较两个字符串
int my_strcmp(const char* arr1, const char* arr2)
{
assert(arr1 && arr2);
while (*arr1 == *arr2)
{
if (*arr1 == '\0')
return 0;
arr1++;
arr2++;
}
return *arr1 - *arr2;
}
ps,在VS上,如果*arr1 > *arr2,返回1 ; = 返回0;< 返回-1
因此可以这样:
if (*arr1 > *arr2)
return 1;
else
return -1;
💶strstr - 字符串查找
函数接口:char *strstr( const char *string, const char *strCharSet );
在string中找strCharSet,如果找到了,返回strCharSet在string中第一次出现的位置;找不到,则返回空指针 NULL
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
if (*str2 == '\0')
return str1;
const char* s1 = str1;
const char* s2 = str2;
const char* yd = str1;
while (*yd)
{
s1 = yd;
s2 = str2;
while (*s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
return yd;
yd++;
}
return NULL;
}
📗mem
💵memcpy - 内存拷贝
void* my_memcpy(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest && src);
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
💵memmove - (重叠)内存拷贝
相当于memcpy的升级版
void* my_memmove(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest && src);
if (dest < src)
{
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
💵memcmp - 比较
int my_memcmp(const void* arr1, const void* arr2,size_t num)
{
assert(arr1 && arr2);
while (num--)
{
if (*(char*)arr1 == '\0')
return 0;
arr1 = (char*)arr1 + 1;
arr2 = (char*)arr2 + 1;
}
return (char*)arr1 - (char*)arr2;
}