字符函数和字符串函数(上)

目录

前言

一、字符串长度函数

1.strlen():

2.strlen()的模拟实现:

 二、字符串拷贝函数

1.strcpy()

2.strcpy()的模拟实现:

三、字符串连接函数

1.strcat

2.strcat的模拟实现

四、字符串比较函数

1.strcmp

strcmp模拟实现


前言

字符串操作函数:

1.求取字符串长度

2.字符串拷贝,字符串连接,字符串比较(受长度限制&不受长度限制)

3.字符串查找

注意:字符串操作都是以字符串结尾标志\0结束的!!!

内存操作函数:

1.内存初始化设置函数

2.内存拷贝函数&内存移动函数

一、字符串长度函数

1.strlen():

size_t strlen(char const* _Str);

strlen()函数可以对一个字符串进行长度进行统计,而统计的结束标志是\0,但不包括\0,函数返回值是一个无符号整数表示字符串长度。

在这段代码中,因为strlen函数遇到\0所以结果是5

2.strlen()的模拟实现:

思路:字符串的储存其实是连续的字符储存,知道遇到结束标志\0。因此,要编写一个求取字符串长度的函数,我们需要传入字符串的起始地址,统计从起始位置到结束位置经理了多少字符。

函数设计:

size_t my_strlen(char* arr) {
	char * p = arr;
	while (*p != '\0') {
		*p++;
	}
	return p - arr;        //指针相减就是他们的相隔的元素个数
}

 代码测试:

我们发现是可以实现我们想要的效果的

 二、字符串拷贝函数

1.strcpy()

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

strcpy()是将source指向原空间的字符串(包括\0)拷贝到destination指向空间里并返回destination空间的起始位置。

 

 我们在调试过程中发现arr1拷贝到arr2的字符串hello world 但是没有变成hello world000000

所以可知在拷贝过程中也拷贝了结束标志\0

2.strcpy()的模拟实现:

思路:我们要将目的空间的字符串拷贝到另一个空间,所以我们要传入两块空间的起始地址(一个是字符串的起始地址,另一个是目的空间的起始地址)。然后返回拷入空间的地址。

函数设计:

char* my_strcpy(char* dest, char* source) {
	char* ptr = dest;
	while (*ptr++ = *source++) { ; }     
    /*相当于 *ptr=*source;
             ptr++;
             source++;*/
	return dest;
}

while(*ptr++=*soure++):需要注意的是*和++优先级相同,则考虑他们的结核性,而结合为从右到左,所以先ptr++,*ptr

需要注意的是这里是后置++(是先使用在++)于是*ptr++变成了*ptr ,ptr+=1

代码测试:

 

 同样arr1变成了hello world

三、字符串连接函数

1.strcat

char *strcat(char *dest, const char *src)

strcat()是将src指向空间的字符串衔接在dest空间字符串的后面

 

 我们发现arr2的字符串衔接到了arr1的后面

2.strcat的模拟实现

思路:

因为我们要连接两个字符串,所以我们要传入两个字符串的起始空间地址,为了连接两个字符串,我们要找到字符串1的结束位置(\0)并将字符串2连接在后面,返回字符串1的起始地址

函数设计:

char* my_strcat(char* dest, char* date) {
	assert(dest);
	assert(date);
	char* ptr = dest;
	while (*ptr != '\0') {
		ptr++;
	}
	while (*ptr++ = *date++) { ; }
	return dest;
}

 代码测试:

同样我们发现可以成功运行需要注意的是arr1的大小要足够连接arr2

并且arr1不能连接自己否则会变成死循环

四、字符串比较函数

1.strcmp

 int strcmp(const char *s1,const char *s2);

strcmp()函数是以此比较字符串里字符的ASCLL码值大小(逐字符比较),

若s1 大于s2返回值>0

若s1 等于于s2返回值=0

若s1 小于s2返回值<0

 s1中f的ASCLL码小于s2中的g,所以返回值小于0

strcmp模拟实现

思路:

因为我们要比较两个字符串的ASCLL大小所以我们需要传入两个字符串的起始地址,依次比较各个字符的大小,返回两个字符串的差值,第一个字符串比第二个大返回值大于0,等于返回值为0,小于返回值小于0.

起始字符h比n小,则直接得结果hello小于你好 

函数设计

int my_strcmp(char* s1, char* s2) {
	assert(s1);
	assert(s2);
	while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2) {
		s1++;
		s2++;
	}
	return *s1 - *s2;
}

代码测试:

测试得知首字符h的ASCLL码比n的小6所以差值为-6,得到字符串arr1小于arr2

 今天先总结部分函数还有一些下篇在写

如有纰漏请不吝赐教,会及时更改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一叶丨之秋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值