【c语言】模拟实现库函数

1.strlen函数

1.常见法

int strlen2(char arr[])
{
	int count = 0;
	while (*arr != '\0')
	{
		count++;
		arr++;
	}
	return count;
}
int main()
{
	char arr[] = { "abcdefg" };
	int ret=strlen2(arr);
	printf("%d ", ret);
	return 0;
}

2.地址-地址

地址-地址得到的就是之间元素的个数

size_t my_strlen(char arr[])
{
	char* start = arr;
	while (*arr != '\0')
	{
		arr++;
	}
	return arr - start;

}
int main()
{
	char arr[] = "abcdefg";
	int len = my_strlen(arr);
	printf("%d ", len);
	return 0;
}

3.递归法

int my_strlen(char arr[])
	{
	if (*arr != '\0')
		return (1 + my_strlen(arr + 1));
	else return 0;
	}
int main()
{
	char arr[] = "abcdefg";
	int len = my_strlen(arr);
	printf("%d ", len);
	return 0;
}

2.strcpy函数

作用:将源字符串的内容拷贝到目标空间

char* strcpy(char * destination, const char * source );

注意事项
1.源字符串要有’\0’ 拷贝时会将源字符串的’\0’一起拷贝过来
2.要保证目标空间足够大
3.目标空间可修改

void my_strcpy(char arr2[], char arr1[])
{
	while (*arr1 != '\0')
	{
		*arr2 = *arr1;
		arr1++;
		arr2++;
	}
	*arr2 = *arr1;
}
int main()
{
	char arr1[] = "hello tyut";
	char arr2[20] = "xxxxxxxxxxxxxx";
	my_strcpy(arr2, arr1);
	printf("%s ", arr2);
	return 0;

#include<assert.h>
void my_strcpy(char arr2[], char arr1[])
{
	assert(*arr1);
	assert(*arr2);
	while (*arr2++ = *arr1++)
	//while()括号里面的时赋值表达式 赋值表达式是有值的
	// int a=2,b=4;
	//int c=a=b;    结果为4 因为a=b的结果为4 赋值给c 
	//当等于\0时,循环中断,但已经赋值了 所以也会将\0赋值给arr2
	{
		;
	}
}
int main()
{
	char arr1[] = "hello tyut";
	char arr2[20] = "xxxxxxxxxxxxxx";
	my_strcpy(arr2, arr1);
	printf("%s ", arr2);
	return 0;
}

3.strcat函数

作用:将源字符串追加到目标空间

char* stract(char * destination, const char * source )

注意事项
1.目标空间必须有’\0’ 知道从哪里开始追加
2.源字符串必须有’\0’ 知道什么时候结束
3.目标空间必须足够可以装下要追加的字符串
4.目标空间大小可以修改 即不能是常量字符串

![char* my_strcat(char arr1[], char arr2[])
{
	char* ret = arr1;
	while (*arr1 != '\0')
	{
		arr1++;
	}
	while (*arr1++ = *arr2++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = "hello";
	char arr2[] = "tyut";
	my_strcat(arr1, arr2);
	printf("%s ", arr1);
}

拓展: 自己追加自己是什么情况
结果在评论区
越界访问

strcpy strcat strcmp是长度不受限制的字符串函数

strncpy strncat strncmp是长度受限制的字符串函数

作用:比较两个字符串中对应位置上两个字符的大小

//使用前需要包含头文件
#include<string.h>
int strcmp(const char *arr1,const char *arr2)
//返回值为int 是因为如果第一个字符大于第二个字符串 >0 
// 如果等于 返回0
//如果小于  返回<0
#include<assert.h>
int my_strcmp(char arr1[], char arr2[])
{
	assert(*arr1 != NULL);
	assert(*arr2 != NULL);
	while (*arr1 == *arr2)
	{
		if (*arr1 == '\0')
			return 0;
		arr1++;
		arr2++;
	}
	return *arr1 - *arr2;

}
int main()
{
	char arr1[] = "slurh";
	char arr2[] = "sludhfdq";
	int ret = my_strcmp(arr1, arr2);
	if (ret > 0)
		printf(">\n");
	else if (ret == 0)
		printf("=\n");
	else
		printf("<\n");

	return 0;
}

5.strncpy函数

char * strncpy ( char * destination, const char * source, size_t num );
void my_strncpy(char arr1[], char arr2[], size_t num)
{
	while (num)
	{
		*arr1++ = *arr2++;
		num--;
	}
}
int main()
{
	char arr1[20] = "xxxxxxxxxx";
	char arr2[] = "abc";
	int num = 3;
	my_strncpy(arr1, arr2, num);
	printf("%s ", arr1);
	return 0;
}

在这里插入图片描述
如果num的数超过了arr2的字符数,将\0也加入到arr1里面后 结果如下
当num =5时
在这里插入图片描述
因为读取字符串时 读取到’\0’就会停止 所以打印出来没有x

6.strncat函数

char* strnact(char * destination, const char * source,size_t num  )
void my_strncat(char arr1[], char arr2[], size_t num)
{
	
	 while (*arr1 != '\0')
	 {
		 arr1++;
	 }
	 while (num)
	 {
		 *arr1 = *arr2;
		 arr1++;
		 arr2++;
		 num--;
	 }
	 *++arr1 = '\0';
}
int main()
{
	char arr1[20] = "adeg";
	char arr2[] = "lishfh";
	int num = 3;
	my_strncat(arr1, arr2, num);
	printf("%s ", arr1);
	return 0;
}

在这里插入图片描述

7.strncmp函数

int strncmp(const char *arr1,const char *arr2,size_t num )
int my_strncmp(char arr1[], char arr2[], size_t num)
{
	while (num)
	{
		if (*arr1 == *arr2)
		{
			arr1++;
			arr2++;
		}
	
		num--;
	}
	if (*arr1 == *arr2)
		return 0;
	else
		return *arr1 - *arr2;
}
int main()
{
	char arr1[] = "slight";
	char arr2[] ="sliohees";
	size_t num = 4;
	int ret=my_strncmp(arr1, arr2, num);
	
	if (ret > 0)
				printf(">\n");
			else if (ret == 0)
				printf("=\n");
			else
				printf("<\n");
		
	return 0;
}

在这里插入图片描述

  • 19
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃南瓜的北瓜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值