前言
在C语言中,有许多库函数,例如:我们最熟悉的printf和scanf,是输入和输出函数。在这里我们就来探讨一下C语言中库函数的定义、使用和我们自己模拟去实现。
一、字符串库函数(string.h)
1.strlen函数
strlen(),这个函数是计算‘\0’之前的字符串长度的。
函数参数是char类型的指针,返回类型是size_t。
#include <string.h>
int main()
{
char arr[] = "abcdefg";
size_t a = strlen(arr);
printf("%zd\n", a);
return 0;
}
模拟实现
知道了原理,那我们就可以模拟实现一下这个字符串函数了。
首先这个函数的类型是size_t ,所以我们也模仿着将函数的返回类型设为size_t。
size_t my_strlen(char* str)
{
}
然后就是strlen的原理:统计\0之前的字符个数。
size_t my_strlen(char* str)
{
size_t num = 0;
while (*str != '\0')
{
num++;
str++;
}
return num;
}
2.strcpy函数
strcpy函数,是字符串复制函数。意思是,将str2的内容复制到str1中。
函数的参数是两个字符串,返回类型是char* 。
int main()
{
char arr1[] = "xxxxxxxxxxxxxxxxx";
char arr2[] = "abcdefg";
char* a = strcpy(arr1, arr2);
printf("arr1:%s\n", arr1);
printf("a:%s\n", a);
return 0;
}
从这个例子中,可以看到arr2数组中的内容全部复制到了arr1数值中,也包含‘ \0 ’。明白了原理就可以试着模拟实现一下这一个函数。
模拟实现
首先,这个函数的返回类型是char*,参数是字符指针。为了让函数更加严谨,我们在char* sor参数前加上一个const,表示sor指针的内容是不可以改变的。
char* my_strcpy(char* des, const char* sor)
{
}
从原理中得知,复制的内容是包括‘ \0 '一起复制过去的,所以这里可以已这一个为判定条件,进行while循环。而且函数返回的第一个字符串,由于进行了++操作,导致des指针已经不指向首元素地址了,所以需要创建一个字符指针来记录首元素地址。
char* my_strcpy(char* des, const char* sor)
{
char* ret = des;
while (*des++ = *sor++)
{
;
}
return ret;
}
3.strcmp函数
strcmp函数,是用来比较两个字符串大小的函数。
意思是,这个函数将会对两个字符串的大小(ASCII码)进行比较,参数是两个字符指针,返回类型是 int 。如果相等返回0,大于返回一个大于0的整数,小于则返回一个小于0的数。
int main()
{
char arr1[] = "ABCD";
char arr2[] = "abcd";
int a = strcmp(arr1, arr2);
if (a > 0)
{
printf("arr1 > arr2");
}
else if (a == 0)
{
printf("arr1 == arr2");
}
else
{
printf("arr1 < arr2");
}
return 0;
}
既然知道了原理,我们也可以试着模拟实现一下这一个函数。
模拟实现
首先,函数的参数是两个字符指针,返回类型是int整型。由于相同返回0,大于返回>0,小于返回<0,所以我们直接判断相同,然后直接返回两个字符指针的ASCII码值(因为比较大小是根据ASCII码值的)。
int my_strcmp(char* str1, char* str2)
{
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
return (*str1) - (*str2);
}
4.strcat函数
strcat函数,是一个字符串与字符串连接的函数。
意思是,将source指针添加到destination指针后面,也就是将两个字符串连接起来。
注意!!!这个函数不会判断你的原始数组是否有足够的空间。警惕数组越界问题!!!
既然知道了原理,我们就可以来模拟实现一下这一个字符串函数。
模拟实现
首先,这一个函数的参数是两个字符指针,返回类型是char* 类型。
第一步,先让des指针指向字符串的最后一位,也就是' \0 ',然后与strcpy函数相同,用while函数来实现覆盖。
char* my_strcat(char* des, char* sor)
{
char* ret = des;
while (*des != '\0')
{
des++;
}
while (*des++ = *sor++)
{
;
}
return ret;
}
5.strstr函数
strstr函数是一个查找字符串的函数。就是在str2字符串中查找str1字符串,如果有就返回str2中出现str1字符串之后的字符串,没有就返回NULL。
int main()
{
char* str1 = "This a simple code!";
char* str2 = "simple";
char* a = strstr(str1, str2);
printf("%s\n", a);
return 0;
}
模拟实现
首先,这个函数的返回类型是char*。接着就是要判断这两个字符串是否相等。只能一步一步遍历。这里定义的三个指针,两个指向str1,一个指向str2。
p是滑动指针,s1,s2用来判断字符串是否相等。
如果s2遍历到 \0 ,那么就返回p指针指向的字符串。(其中要注意的是,遍历过程中,有可能str2中的某一个字母与str1中相同,但是后面却不一样,如果不把s2重新指向str2,将会吞掉前面的字符。)
char* mystrstr(char* str1, char* str2)
{
char* s1 = str1;
char* s2 = str2;
char* p = str1;
while (*p)
{
s1 = p;
s2 = str2;
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)p;
}
p++;
}
return NULL;
}
int main()
{
char* str1 = "This a simple code!";
char* str2 = "simple";
char* a = mystrstr(str1, str2);
printf("%s\n", a);
return 0;
}
二、排序函数
qsort函数
这是C语言库函数中最常用的排序函数,也是典型的回调函数例子。
这个函数最厉害的地方就是,任何类型的数据都能进行排序,而且是快速排序,时间复杂度最低的排序方法。
首先,函数第一个参数是这个需要排序的数据的首元素地址。
第二个参数是,需要排序数据的长度。
第三个参数是,需要排序数据的大小(每个元素的大小)。
第四个就是一个回调函数了。(这个回调函数是要根据排序数据的类型自行编写的)
这个回调函数返回类型是int整型,其实有点像strcmp函数,比较两个数的大小。
假设,排序的数据类型是int整型:
int cmp_int(const void* s1,const void* s2)
{
return *(int*)s1 - *(int*)s2;
}
下面是这个函数的实现:
int arr[] = { 1,52,20,45,5 };
char* arr1[] = { "fff","ddd","kkk" };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_int);
for (int i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
这就是我们C语言中常用到的库函数,希望对大家有所帮助!!!
记得点赞收藏噢~~~