哈喽,小伙伴们,我们又见面了,上次讲完strlen函数的模拟实现后,发现还比较受大家欢迎,因此,本次给大家带来模拟函数的完结篇。温馨提示:本篇文章将会涉及到可能还未学到的实用性较高的库函数哟。当然答应大家的小福利也会放在本篇文章的末尾哦。
那么我们开始上课!
首先我们先来讲讲字母拼接的函数
stract函数作用:拼接字符串
目标:将两个数组的字符串拼接到一起。
运行原理:先找到要拼接的数组字符串的'\0',其次用赋值的符号(=)拼接上去。
上代码,
char my_stract(char* dest, char* str)
 {
     char* ret = *dest;
     assert(dest && str);//防止是空指针
     while (*dest != '\0')//找到arr1的'\0'
     {
         dest++;  
     }
     while (*dest++ = *str++)//把arr2的字符串赋值给arr1
     {
         ;
     }
     return ret;
 }                                        //stract:拼接
 int main()
 {
     char arr1[20] = "abcdefg";
     char arr2[20] = "hijklmn";
     my_stract(arr1, arr2);
     printf("%s",arr1);
     return 0;
 } 
strcpy函数作用:拷贝(复制)
运行原理:先将'\0'前面的字符串以赋值的方式传递给另一个变量,再将'\0'传过去
char my_strcpy(char* dest, const char* str, size_t num)
 {
     char* ret = *dest;
     assert(dest && str);
     while (*str != '\0')//'\0'前面的字符串,通过循环的方式赋值给另一个变量
     {
         *dest = *str;
         dest++;
         str++;
     }
     if (*str == '\0')//将'\0'传过去
     {
         *dest = *str;
     }
     return ret;
 }
 int main()
 {
     char arr1[20] = "hellobite";
     char arr2[20] = { 0 };
     my_strcpy(arr2, arr1, 9);
     printf("%s", arr2);
     return 0;
 }
strcmp函数
作用:比较字符串的大小
运行原理:根据ASCLL码值进行比较大小,大于则返回大于的数,小于则返回小于的数,等于则返回0
第一种
int my_strcmp(const char* str1,const char* str2)
 {
     assert(*str1&&* str2);
     while (*str1 == *str2)
     {
         if (*str1 == '\0' && *str2 == '\0')
             return 0;
         str1++;
         str2++;
     }
     if (*str1 > *str2)  //strcmp:比较字符串的内容大小
     {
         return 1;
     }
     if (*str1 < *str2)
         return -1;
 }
 int main()
 {
     char arr1[] = "abcdefghijklmn";
     char arr2[] = "abcdefghijklmn";
     int ret=my_strcmp(arr1, arr2);
     printf("%d", ret);
     return 0;
 }
第二种:
int my_strcmp(const char* str1,const char* str2)
 {
     assert(*str1&&* str2);
 int my_strcmp(const char* str1, const char* str2)
 {
     assert(*str1 && *str2);
     return *str1 - *str2;//让两个字符串做差(其实是字符串的ASCLL码做的差)
 }
 int main()
 {
     char arr1[] = "abcdefghijklmn";
     char arr2[] = "abcdefghijklmn";
     int ret=my_strcmp(arr1, arr2);
     printf("%d", ret);
     return 0;
 }
此外,还有三个与这仨函数比较像的
strcmp strncmp
strcpy strncpy
stract strnact
这两组函数他们在功能上并没有多大的差别,只不过带了n的比不带n的更加安全
strtok函数作用:
{
assert(dest && str);
void* ret = dest;
while (num--)
{
*(char*)dest = *(char*)str;//因为20是字节数,并且char类型字节数是1,符合我们的目标,所以强转为char型
dest = (char*)dest + 1;//赋值完后字节数+1,直至num==0
str = (char*)str + 1;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[20] = { 0 };
my_memcpy(arr2, arr1, 20);//20是字节
for (int i = 0;i < 20;i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
今天的内容到这里就要结束了,那么我先前说过的奖励当然给到大家