详细分析字符串函数(1): strlen,strcpy,strcmp

"本文详细介绍了C语言中常用的字符串处理函数strlen、strcpy和strcmp的原理及实现。strlen通过遍历字符串直到找到结束标识符''来计算长度;strcpy则将源字符串复制到目标字符串,包括'';strcmp通过逐个字符比较来确定字符串之间的大小关系。文章还提供了每个函数的实现代码示例,帮助读者理解其工作原理。"
摘要由CSDN通过智能技术生成

首先字符串函数都是属于库函数<string.h>,所以在使用前我们需要引用它!下面我就不一一说明了。

1.strlen

相信大家对strlen都十分熟悉,它是计算字符串长度大小的

首先我们讲一下字符串

char str[] = "abcdef";

像上面我们定义了一个字符串为 abcdef

他在内存中存储的是 abcdef\0

"\0"就是字符串结束标识符,在访问字符串的时候只访问到"\0"出现的位置,也为我们字符串函数功能的实现提供了帮助

strlen函数的功能原理是什么呢?

它是从这个字符串的起始位置str下标为0也就是a开始判断,上面我们说过字符串结束标识符。

那么思考一下我们有了起始位置和结束标识符这个strlen函数是如何实现的呢?

来听听我的思路:

1.首先strlen是个函数,所以我们要将字符串首元素地址传递过去,也就是strlen的用法---strlen(str);

2.传完地址后用一个指针接收,指针是指向const*型的

3.随后我们解引用这个指针看这个地址中存放的是否是我们的结束标志'\0',找到'\0'的地址位置。当然我们的一个字符串未知数量的字符,所以我们要用一个while循环,每次指针的位置后移一位

4.当我们找到'\0'的地址的时候,只要与传递字符串的首地址相减,就得到了字符串得长度

但我们的首元素地址已经移到'\0'的位置,所以我们在开始的时候要用另一个指针来保存首元素地址,最后来相减

接下来让我们来实现

#include <stdio.h>
#include <assert.h>

int my_strlen(const char* pstr)
{
	assert(pstr);  //此处为断言 判断pstr是否传递的是空指针
	char* p = pstr;
	while (*pstr != '\0')
	{
		pstr++;
	}
	return pstr - p;
}

int main()
{
	char str[] = "abcdef";
	int n = my_strlen(str);
	printf("%d\n", n);
	return 0;
}

 

 

2.strcpy

strcpy顾名思义是将字符串拷贝

假如你有字符串1和字符串2,你想将字符串2拷贝到字符串1中,那么就可以使用strcpy

 strcpy传递的参数是两个指针,也就是字符串1和字符串2的起始地址

Destination的意思是目的地,Source是来源。

所以

	strcpy(arr1, arr2);

arr1为被改变的字符串,arr2为被拷贝的字符串。被拷贝的字符串不需要改变,所以在接收参数的时候用const来修饰保护它。

在使用前需要注意!

arr1的长度必须大于arr2的长度,不然的话会造成数组越界访问

strcpy的思路也很简单

就是将arr2的每个值赋值给arr1中包括'\0'

跟strlen的写法差不多,下面让我们来实现它

char* my_strcpy(char* dest, const char* src)
{
	assert(src && dest);
	char* ret = dest;
	while (*dest++ = *src++) //dest和src的值可以写在while判断条件中,并且每次执行完+1
	{

	}
	return ret;
}

int main()
{
	char arr1[20] = { 0 };
	char* arr2 = "hello xiaochenxi";
	printf("%s", my_strcpy(arr1, arr2));
	return 0;
}

 

3.strcmp

字符串比较

但是注意了比较的不是字符串的长度,而是比较字符串中对应位置上的字符大小,如果相同,就比较下一对,直到不同或者都遇到\0

 

strcmp返回的是个int型数 有三种状况  如上图所示

1.字符串1小于字符串2的时候返回小于0的数

2.字符串1等于字符串2的时候返回0

3.字符串1大于字符串2的时候返回大于0的数

 

int my_strcmp(const char* dest,const char* src)
{
	assert(dest && src);
	while (*dest == *src)  //当他俩相等的时候,继续访问下一位
	{
		if (*dest == 0) //如果他俩长度一样,且元素一样那么返回0,判断其中一个是否为0就可以 
		{
			return 0;
		}
		dest++;
		src++;
	}
	if (*dest > *src)    
	{
		return 1;
	}
	else if (*dest < *src)
	{
		return -1;
	}

}


int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "hello";
	printf("%d", my_strcmp(arr1, arr2));
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

肖晨曦7

真的有人赏我一下吗?

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

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

打赏作者

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

抵扣说明:

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

余额充值