模拟实现字符函数2-strcmp strcpy strcat函数

目录

1.strcmp

2.strcpy

3.strcat


1.strcmp

strcmp函数:函数参数为两个,第一个参数为对比字符串1的地址,类型为字符型指针(const修饰char*表示不可通过指针修改指向地址内容)。第二个参数为对比字符串2的地址,类型为字符型指针(const修饰char*表示不可通过指针修改指向地址内容)。当字符串1大于字符串2时,返回值为正数。当字符串1等于字符串2时,返回值为0。当字符串1小于字符串2时,返回值为负数。类型为int类型。

strcmp函数是通过对比两个字符串每一位的对应位置的大小,从第一个字符向后逐个比较,当出现对应字符不相等时,比较结束。有一个字符串指针都到末尾位置时,比较结束。

总结归纳:

(1)当两个字符串逐字符比较到末尾位置时都相等时,返回值为0

(2)当两个字符串逐字符比较到字符不相等时。参数1字符大,返回正数;参数2字符大,返回负数。(因此返回值为参数1与参数2的差值,符合要求)

思路:

先用assert函数判断传入指针是否为空指针,为空指针时执行断言(便于后续排错),否则正常运行。

当两个字符串的首字符相等时,往后判断下一位字符是否相等,如果相等就继续向后遍历,如果不等或者有一个指针指向字符串末尾就退出循环。返回值为第一个参数和第二个参数字符的差值。

代码实现:

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

int my_strcmp(const char* p1, const char* p2)//p1为参数1,p2为参数2
{
	assert(p1 && p2);
	while (*p1 == *p2 && *p1 && *p2)
	{
		p1++;
		p2++;
	}
	return *p1 - *p2;
}

int main()
{
	char arr1[] = "asjfn";
	char arr2[] = "SAF";
	printf("%d\n", my_strcmp(arr1, arr2));
	printf("%d\n", my_strcmp(arr1, arr1));
	printf("%d\n", my_strcmp(arr2, arr1));
	return 0;
}

运行结果:

2.strcpy

strcpy函数:函数参数为两个,第一个参数为目标的字符串的地址,类型为字符型指针。第二个参数为替换的字符串的地址,类型为字符型指针(const修饰char*表示不可通过指针修改指向地址内容)。返回值为目标字符串的地址,类型为char*类型。

strcpy函数是将替代字符串从首字符开始,逐个字符赋给对应位置的目标字符。直到目标字符串指针到达末尾字符位置('\0')时,结束赋值操作。

总结归纳:

(1)替代字符串从首字符开始,逐个字符赋给目标字符串对应位置偏移量的字符

(2)返回值为目标的字符串的传入地址。

思路:

先用assert函数判断目标字符串的空间大小是否为不小于替代字符串的空间大小,当目标字符串空间小于替代字符串时执行断言(便于后续排错),否则正常运行。目标字符串空间不能小于替代字符串,否则无法存进替代字符串多出空间的字符。

用assert函数判断传入指针是否为空指针,为空指针时执行断言(便于后续排错),否则正常运行。

替代字符串从传入地址开始向后逐字符替换目标字符串传入地址相同偏移量位置上的字符。当替代字符串指针到达末尾位置时,不再向后移动,目标字符指针依旧向后逐字符移动。当目标字符串指针走到末尾位置时,结束循环。

代码实现:

#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)//dest为目标字符串指针,src为替代字符串指针
{
	assert(strlen(dest) > strlen(src));
	assert(dest && src);
	char* ret = dest;
	while (*dest)//当dest指向'\0'(字符串末尾)时
	{
		*dest = *src;
		dest++;
		if (src != '\0')
		{
			src++;
		}
	}
	return ret;
}
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "alter";

	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

运行结果:

3.strcat

strcat函数:函数参数为两个,第一个参数为目标的字符串的地址,类型为字符型指针。第二个参数为添加的字符串的地址,类型为字符型指针(const修饰char*表示不可通过指针修改指向地址内容)。返回值为目标的字符串的地址,类型为char*类型。

strcat函数是将添加字符串放在目标字符串的末尾,逐个字符覆盖目标字符串从末尾地址往后的空间内容。直到添加字符串指针到达末尾字符位置('\0')时,赋值操作结束后,添加字符串操作结束。

总结归纳:

(1)添加字符串逐个字符覆盖目标字符串从末尾地址往后的空间内容

(2)返回值为目标的字符串的传入地址

思路:

先用assert函数判断传入指针是否为空指针,为空指针时执行断言(便于后续排错),否则正常运行。

先将目标字符串指针移动到其末尾地址处停止。末尾地址对应添加字符串的传入地址,将添加字符串地址内容替换对应目标字符串的地址的内容。直到添加字符串指针指向其末尾地址('\0')时,结束循环。

代码实现:

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

char* my_strcat(char* dest, const char* src)//dest为目标字符串指针,src为添加字符串指针
{
	assert(dest && src);
	char* ret = dest;
	while (*dest)//当dest指向'\0'地址(字符串末尾地址)时,结束循环
	{
		dest++;
	}
	while (*dest++ = *src++)//当src指向'\0'地址时,结束循环//src指针指向'\0'地址的内容先覆盖掉dest指针指向的地址内容,while循环才结束
	{
        ;
	}
	return ret;
}
int main()
{
	char arr1[30] = "hello world!";
	char arr2[] = "hello doudou!";

	printf("%s\n", my_strcat(arr1, arr2));
	return 0;
}

运行结果:

 如有不当之处,望大佬指正。

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值