文章目录
前言
为了更好的使用和掌握C语言中的库函数,在本文中记录一下自己模拟实现的库函数。更好的促进记忆和理解。
strlen库函数的模拟实现
strlen为字符串的计数函数遇到‘\0’停止计数
函数的返回值是无符号的
int my_strlen(const char* str)
{
assert(str);
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
strcpy库函数的模拟实现
strcpy函数需要拷贝的目的地和拷贝字符串作为形参
源字符串需要以‘\0’结束,‘\0’也会被拷贝进入目标空间
目标空间足够大
char* my_strcpy(char* dest,const char* src)
{
char* ret = dest;
assert(dest && src);
while (*dest++ = *src++)
{
;
}
return ret;
}
ret用来存储dest的初始地址
strcmp库函数的模拟实现
原理为两个字符串逐字符比较大小
比较返回值大小可得出两个字符串大小比较的结果
int my_strcmp(char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
strcat库函数的模拟实现
源字符串以’\0’结束
目标空间足够大
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;
assert(dest && src);
while (*dest)
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
strstr库函数的实现
函数返回值为char * 类型
char* my_strstr(const char* str, const char* substr)
{
const char* s1 = str;
const char* s2 = substr;
const char* cur = str;
assert(str && substr);
if (*substr == '\0')
{
return (char*)str;
}
while (*cur)
{
s1 = cur;
s2 = substr;
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
return (char*)cur;
cur++;
}
return NULL;
}
memcpy库函数模拟实现
函数从source的位置开始向后复制num个字节的数据到dest的内存位置
遇到’\0’不会停下来
如果source和dest有重叠,复制的结果都是未定义的
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的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的
如果源空间和目标空间出现重叠,就得使用memmove函数处理
memmove会出现重叠部分在前和重叠部分在后的情况,需要分情况实现
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;
}