哈喽,小伙伴们,我们又见面了,上次讲完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;
}
今天的内容到这里就要结束了,那么我先前说过的奖励当然给到大家