模拟实现string.h中的各类函数
文章目录
字符串操作函数
模拟实现strlen
这是最简单的一类string函数,输入一个字符串,返回一个字符串长度,这里要注意的是,这里的长度不包括‘\0’,实现代码如下
int my_strlen(char * str)
{
int i = 0;
while (*str != '\0')
{
i++;
str++;
}
return i;
}
模拟实现strcpy
对字符串进行拷贝
char * my_strcpy(char * str1, char * str2)
{
char * ret = str1;
while (*(str1++) = *(str2++))
{
;
}
return ret;
}
模拟实现strcat
char * my_strcat(char * str1,char *str2)
{
char * ret = str1;
while (*str1)
{
str1++;
}
while (*str1++=*str2++)
{
;
}
return ret;
}
模拟实现strcmp
int my_strcmp(char * str1, char * str2)
{
char * pa = str1;
char * pb = str2;
int ret = 0;
while (!(ret = (*pa) - (*pb)) && *pb )
{
pa++;
pb++;
}
if (ret !=0)
return 1;
if (ret == 0)
return 0;
}
模拟实现strstr
char * my_strstr(char * str1, char* str2)
{
char * pa = str1;
char * pb = str2;
char * a = NULL;
if (*pa == '\0')
return NULL;
while (*pa)
{
a = pa;
pb = str2;
//当两个数组元素相同且都不为0时才开始比较
while (*a && *pb && (*a == *pb))
{
//继续比较下一个元素的值
a++;
pb++;
}
if (*pb == '\0')
return pa;
//如果不同就让str1移动一位继续比较
pa++;
}
}
内存操作函数
与字符串操作函数类似,但是区别在于可以直接针对地址进行修改,无论传进去的是什么类型的变量,都可以操作。核心思想是强转成char*进行操作。
模拟实现memcpy
void * my_memcpy(void * str1, void * str2, int num)
{
void *pa = str1;
while (num)
{
*(char *)str1 = *(char *)str2;
++(char *)str1;
++(char *)str2;
num--;
}
return pa;
}
模拟实现memmove
void * my_memmove(void * str1, void * str2, int num)
{
void * ret = str1;
//str2在str1数组的内部
if (str1 > str2 || (char *)str1 < (char *)(str2) + num)
{
str1 = (char *)str1 + num - 1;
str2 = (char *)str2 + num - 1;
while (num)
{
*(char *)str1 = *(char *)str2;
--(char *)str1 ;
--(char *)str2;
num--;
}
}
//在外部直接strcpy
else
{
while (num)
{
*(char*)str1 = *(char *)str2;
str1 = (char *)str1 + 1;
str2 = (char *)str2 + 1;
num--;
}
}
return ret;
}