携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情
🔞模拟实现库函数
模拟实现strcpy
void my_strcpy(char* des,char* sor)
{
while (*sor!='\0')
先遍历源字符串的\0,把\0之前的元素全部拷贝到目标字符串中
{
*des = *sor;
des++;
sor++;
}
最后再把\0拷贝到目标字符串中
*des = *sor;
}
对上面的代码进行超级优化,一些其他的优化就不一 一展示了
char* my_strcpy(char* des, const char* sor)
{
assert(des && sor);
这个库函数上面讲了
char* ret = des;
while (*des++ = *sor++);
return ret;
}
模拟实现strlen
实现方法1:计数器方法
int my_strlen(const char* str)
{
int ret = 0;
while (*str++)
ret++;
return ret;
}
实现方法2:指针方法
size_t my_strlen(const char* str)
{
const char* temp = str;
保证temp的类型和str的类型一致
while (*++str);
为了找到\0
return str - temp;
指针相减得到它们直之间的元素的个数
}
实现方法3:函数递归方法
int my_strlen(const char* str)
{
if (*str)
return 1 + my_strlen(str + 1);
else
return 0;
}
判断是不是\0,不是指针就往后走一步,是就返回0,一步一步进行累加求和.
模拟实现strcmp
库函数的使用过程看上文 看代码:
int my_strcmp(const char* str1, const char* str2)`
{
while (*str1==*str2&&*str1&&*str2)`找到不相同的字符
{
str1++;
str2++;
}
//出来循环之后有两种情况:
//1字符不相等,
//2.至少有一个字符串访问到了\0.
//不管是哪一种情况,直接相减,即可判断谁大谁小还是相等
return *str1 - *str2;
}
模拟实现strstr
char* my_strstr(const char* str1, const char* str2)
{
const char* temp1 = str1;
const char* temp2 = str2;
if (*str2=='\0')//字符串长度为0直接返回str1
return (char*)str1;
while (*str2)
{
while (*str1 != *str2 )
{
str1++;
if (*str1 == '\0')
return NULL;
}
//找到了相同的字符了
temp1 = str1;
while (*str1 == *str2)
{
str1++;
str2++;
if (*str2 == '\0')
return (char*)temp1;
}//没有找到,从新进行标记查找
str2 = temp2;
str1 = temp1 + 1;
}
}
模拟实现strcat
char* my_strcat(char* dest, const char* sou)
{
char* ret = dest;
while (*dest)找到\0
{
dest++;
}
while (*dest++ = *sou++)追加
;
return ret;
}
模拟实现qsort
用冒泡排序函数模拟实现qsort
int cmp_stu_age(const void* a,const void* b)
这个是需要自己的定义的
{
int aa = ((stu*)a)->age;
int bb = ((stu*)b)->age;
if (aa > bb)return 1;
if (aa < bb)return -1;
return 0;
}
void swap(char* e1,char* e2,int size)
这里是内存中的数据以一个一个字节的形式进行交换
{
int i = 0;
char temp;
for (i=0;i<size;i++)
{
temp = *(e1 + i);
*(e1 + i) = *(e2 + i);
*(e2 + i) = temp;
}
}
void my_qsort(void* ptr,int n,int size,int(*cmp)(const void*,const void*) )
{
int i, j;
int count = 0;
for (i=0;i<n-1;i++)
{
for (j=0;j<n-1-i;j++)
{
if ((cmp((char*)ptr + j * size , (char*)ptr + (j + 1) * size)) > 0)
{
swap((char*)ptr + j * size, (char*)ptr + (j + 1) * size,size);
count = 1;
}
}
if (count == 0)
break;
}
}
int main()
{
stu people[3] = { {20,"maole",181},{32,"wngshaobi",162},{18,"aeivc",170}};
my_qsort(people, sizeof(people) / sizeof(people[0]), sizeof(people[0]), cmp_stu_age);
return 0;
}
模拟实现memcpy
void* my_memcpy(void* dest, const void* src, int count)
{
void* ret = dest;
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
模拟实现memmove
有两种情况,第一是,
src < dest,另一种是大于等于的情况。每种情况的拷贝方法不一样,前一个是从后往前拷,后一个是从前往后后拷。
void* my_memmove(void* dest, const void* src, int count)
{
void* ret = dest;
if (src < dest)
{
while (count--)
*((char*)dest+count) = *((char*)src + count);
}
else
{
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
return ret;
}
模拟实现atoi
b代表数值的正负 a代表有没有查找到
数字字符,查找到为0,没有查找到为1 sum表示要输出的数值
int my_atoi(const char* temp)
{
int sum = 0;
int a = 1;
int b = 1;
while (*temp)
{
//开始时排除+ - 和空格
while (*temp == ' ')
{
temp++;
}
if (*temp == '-' && a == 1)
{
b = -1;
temp++;
}
else if (*temp == '+' && a == 1)
{
b = 1;
temp++;
}
//找到数字字符
while (*temp >= '0' && *temp <= '9')
{
if (a == 0)
{
sum *= 10;
}
sum += *temp - '0';
a = 0;
temp++;
}
//此处一定不是数字字符
break;
}
return b * sum;
}
模拟实现strncat
char* my_strncat(char* des,const char* sor,int n )
{
char* ret = des;
while (*des)
des++;
while (n&&*sor)
{
*des++ = *sor++;
n--;
}
*des = '\0';
return ret;
}
模拟实现strncpy
char* my_strncpy(char* des, const char* sor, int n)
{
char* ret = des;
while (n)
{
*des++ = *sor++;
n--;
if (*(sor - 1) == '\0')
break;
}
return ret;
}