1.模拟实现strlen
其声明:size_t strlen(const char*str)
(1)字符串以'\0’作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包含'\0')
(2)参数指向的字符串必须以'\0'结束
(3)函数返回值是size_t是无符号整数
实现的代码如下:
#include<stdio.h>
int my_strlen(const char* str)
{
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
int len=my_strlen(arr);
printf("%d\n", len);
return 0;
}
2.模拟实现strcpy
其声明char*strcpy(char*dest,const char*soure)
(1)源字符串必须以'\0’结束
(2)会将源字符串中的'\0',拷贝到目标空间
(3)目标空间必须足够大,以确保能存放源字符串
(4)目标空间必须可变
实现代码如下:
#include<stdio.h>
void my_strcpy(char* s1,const char* s2)
{
while (*s1++ = *s2++)
{
}
}
int main()
{
char s1[20] = { 0 };
char s2[] = "abcdef";
my_strcpy(s1, s2);
printf("%s", s1);
return 0;
}
3.模拟实现strcmp
其声明int strcmp(const char*str1,const char*str2)
标椎规定:(1)str1大于str2返回大于0的数
(2)str1==str2返回0
(3)str1小于str2返回小于0的数
代码如下:
int my_strcmp(const char* src, const char* dst)
{
int ret = 0;
assert(src && dst);
while (!(ret = *(unsigned char*)src - *(unsigned char*)dst) && *dst)
{
src++;
dst++;
}
if (ret > 0)
return 1;
else if (ret < 0)
return -1;
return ret;
}
int main()
{
char s1[] = "abcdef";
char s2[] = "cdefab";
int ret=my_strcmp(s1, s2);
if (ret > 0)
printf("s1>s2");
else if (ret == 0)
printf("s1=s2");
else
printf("s1<s2");
return 0;
}
4.模拟实现strcat
其声明char*strcat(char*dest,const char*soure)
(1)源字符串必须以'\0'结束
(2)目标空间必须足够大,能容纳下源字符串的内容
(3)目标空间必须修改
(4)不能自己给自己追加
代码如下:
#include<stdio.h>
#include<assert.h>
char* my_strcat( char* s1,const char* s2)
{
char* ret = s1;
assert(s1 && s2);
while (*s1)
{
s1++;
}
while (*s1++ = *s2++)
{
;
}
return ret;
}
int main()
{
char s1[20] = "abcdef";
char s2[] = "ghijk";
my_strcat(s1, s2);
printf("%s\n", s1);
return 0;
}
5.模拟实现strstr
其声明char*strstr(const char*s1,const char*s2)
代码如下:
//#include<stdio.h>
//#include<assert.h>
char* my_strstr(const char* str1,const char*str2 )
{
assert(str1 && str2);
char* s1 = str1;
char* s2 = str2;
char* cur = str1;
if (!*str2)
return str1;
while (*s1&&*s2)
{
s1 = cur;
s2 = str2;
while (*s1==*s2&&*s1 && *s2)
{
s1++;
s2++;
}
if (*s2 == '\0');
return cur;
cur++;
}
return NULL;
}
int main()
{
char s1[] = "abcdef";
char s2[] = "abcd";
char* ret = my_strstr(s1, s2);
if (ret !=NULL)
printf("yes\n");
else
printf("no\n");
return 0;
}
6.模拟实现memcpy
其声明void*memcpy(void*dest,const void*source,size_t num)
(1)函数memcpy从source的位置开始向后复制num个字节的数到dest的内存位置
(2)这个函数在遇到'\0'的时候并不会停下来
(3)如果source和dest有任何重叠的地方,复制结果都是为定义
在一些编译器中memcpy处理不了内存重叠的情况
代码如下:
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, void* src, size_t num)
{
void* ret = dest;
assert(dest && src);
while (num--)
{
*(char*)dest = *(char*)src;
++(char*)dest;
++(char*)src;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[] = { 5,4,3,2,1 };
my_memcpy(arr1,arr2,5*sizeof(int));
for (int i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
7.模拟实现memmove
其声明void*memmove(void*dest,const void*source,size_t num)
如果源空间和目标空间重叠就用memmove处理
代码如下:
#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dest, void* src, size_t count)
{
void* ret = dest;
assert(dest && src);
if (dest < src)
{
while (count--)
{
*(char*)dest = *(char*)src;
++(char*)dest;
++(char*)src;
}
}
else
{
while (count--)
{
*((char*)dest + count) = *((char*)src + count);
}
}
return ret;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr + 2, arr, 5*sizeof(int));
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}