C语言常用库函数和模拟实现

本文详细介绍了C语言中几个常用库函数,如strlen用于计算字符串长度,strcpy用于字符串复制,strcmp用于比较字符串,以及qsort快速排序函数。通过模拟实现,展示了如何理解和运用这些函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在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语言中常用到的库函数,希望对大家有所帮助!!!

记得点赞收藏噢~~~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值