模拟实现字符串操作函数

 

目录:

模拟实现Mystrlen

模拟实现My_strcpy

 模拟实现My_strcmp

模拟实现strcat

前言:对于基本的使用字符串操作函数应该是很容易的,为了加深一下对于操作函数的理解,稍稍模拟一下函数实现

--------------------------------------------------------------------------------------------------------------------------------

模拟实现Mystrlen

原型:strlen(str)

目的:计算str的长度

实现方式:递归

//递归实现strlen
#include<stdio.h>
#include<string.h>
int my_strlen(char* a)
{
	if (*a == '\0')
		return 0;
	return 1 + my_strlen(++a);
}
int main()
{
	char* a = "abcdef";
	int len = my_strlen(a);
	printf("%d", len);
	return 0;

}

1.使用递归前要明确递归的退出条件

2.每一次地址都会从左端向右移动一个字节,直到碰到'\0'

实现方式:指针及计数器

//实现strlen计数器
#include<stdio.h>
int my_strlen(char* a)
{
	int count = 0;
	while (*a != '\0')
	{
		a++;
		count++;
	}
	return count;
}
int main()
{
	char* a = "abcdefasdf";
	int len = my_strlen(a);
	printf("%d", len);
	return 0;
}

1.同样的道理,传的地址是字符串"abcdefasdf"中的首地址

2.由于元素类型是char*,所以a++跳过一个字节

3.使用count记录在'\0'前有多少个字符

---------------------------------------------------------------------------------------------------------------------------------

模拟实现My_strcpy

原型:strcpy(arr1,arr2)

目的:将arr2中的字符串复制到arr1中

实现方式:

void my_strcpy(char* a, char* b)
{
	while (*b != '\0')
	{
		*a++ = *b++;
	}
	*a++ = *b++;//将'\0'复制到a中
}
int main()
{
	char a[20];
	char* b = "abcdefasd";
	//strcpy(a, b);
	my_strcpy(a, b);
	printf("%s", a);
	return 0;
}

1.在函数my_strcpy中 *a++ = *b ++的作用就是将arr2中的'\0'复制过去

2.由于是将b复制到a中那么也要将'\0'复制过去,否则将会出现以下情况

 --------------------------------------------------------------------------------------------------------------------------------

 模拟实现My_strcmp

原型:strcmp(str1,str2)

目的:比较两个字符串是否相同,相同返回0,若str1<str2返回负数,str1>str2返回正数

模拟实现:

#include<stdio.h>
//实现比较字符串strcmp  相同返回0 若a<b返回负数 a>b返回正数
int  my_strcmp(char* a, char* b)
{
	while (*a == *b)
	{
		if (*a == '\0')
			return 0;	
		a++;
		b++;
	}
	if (*a > *b)
		return 1;
	else if (*a < *b)
		return -1;
//这里也可以return *a - *b
}
int main()
{
	char* a = "bcdef";
	char b[20] = "bcdef";
	int len = my_strcmp(a, b);
	printf("%d", len);
	return 0;
}

1.如果*a和*b相同那么进入while循环,使a和b往下走直至两者不同退出循环,或者两者等于'\0' 退出循环,这两个都是退出循环的条件

2.如果*a和*b不相等那么就进入if else判断中

---------------------------------------------------------------------------------------------------------------------------------

模拟实现strcat

原型:strcat(str1,str2)

目的:将字符串str2添加到字符串str1的尾部连接两个字符串

模拟实现:

char* my_strcat(char* arr1, const char* arr2)
{
	char* ret = arr1;//保存一下arr1的地址
	while (*arr1 != '\0')
		arr1++;
	while (*arr2 != '\0')
	{
		*arr1 = *arr2;
		arr1++;
		arr2++;
	}
	*arr1 = '\0';//将arr2中的'\0'连接到arr1中
	return ret;
}

1.先找到arr1中指向'\0'的地址,这也是连接开始的点,arr2和arr1连接的时候要覆盖'\0'否则

打印的时候只会打印arr1

2.在过程中会改变arr1的地址,所以要提前保存一下arr1的地址,以便于下面返回

  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Obto-

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

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

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

打赏作者

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

抵扣说明:

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

余额充值