字符串函数strcpy.strcat.strcmp的应用和模拟实现

strcpy 的应用和模拟实现

strcpy详解:

先来看下官网对strcmp的介绍。

在这里插入图片描述
绿色部分括号内为需要的两个参数.
第一个 char * destination 指的是目标字符串的起始地址;
第二个 conset char * source 指的是要拷贝的字符串;
最前面的 char * strcpy 表明返回类型为 字符指针.(返回目标空间destination的起始地址)

注意:用这个库函数时要引用头文件<string.h>

实例代码

int main()
{
	char dest[] = { "elon" };
	char src[] = { "musk" };
	strcpy(dest, src);
	//打印复制后的dest内容
	printf("%s\n", dest);
	return 0;
}

在这里插入图片描述
在这里大家可以看到 src 里的内容已经成功复制到了 dest 里面

细节注意:

  • 因为函数在拷贝字符串src时是到 \0 是才能停止。所以在将拷贝的内容放到dest是要确保dest里面有足够的空间(至少可以包含 \0 ),否则在后续使用 如打印dest时会因没有 \0 而报错。
  • 在这里插入图片描述

模拟实现:

char* my_strcpy(char* dest[], const char* src[])
{
	//保存目标函数的初始地址
	char* ret = dest;
	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	//最后将 \0 也copy过去
	*dest = *src;
	return ret;
}

int main()
{
	char dest[] = { "elon" };
	char srce[] = { "musk" };
	my_strcpy(dest, srce);
	//打印复制后的dest内容
	printf("%s\n", dest);
	return 0;
}

函数内部while循环我们可以再优化一下:

char* my_strcpy(char* dest[], const char* src[])
{
	//保存目标函数的初始地址
	char* ret = dest;
	while (*dest++ = *src++)
		;
	return ret;
}

int main()
{
	char dest[] = { "elon" };
	char srce[] = { "musk" };
	char * ret = my_strcpy(dest, srce);
	//用my_strcpy的返回值打印复制后的内容
	printf("%s\n", ret);
	return 0;
}

这里我们也可以用my_strcpy的返回值打印复制后的内容。

strcat 的应用和模拟实现

strcat详解:

先来看下官网对strcat的介绍。

在这里插入图片描述
绿色部分括号内为需要的两个参数.
第一个 char * destination 指的是被链接字符串的起始地址;
第二个 conset char * source 指的是要连接的字符串的起始地址;
最前面的 char * strcat 表明返回类型为 字符指针.(返回目标空间destination的起始地址)

注意:用这个库函数时要引用头文件<string.h>

实例代码

int main()
{
	char dest[20] = { "elon " };
	char src[] = { "musk" };
	char * ret = strcat(dest, src);
	//打印连接后的dest内容
	printf("%s\n", ret);
	return 0;
}

在这里大家可以看到 src 里的内容已经成功连接到了 dest 后面

细节注意:

  • 目标空间同样要保留足够的空间,防止溢出
    在这里插入图片描述

模拟实现:

char* my_strcat(char* dest, const char* src)
{
	//保存目标函数的初始地址
	char* ret = dest;
	while (*dest != '\0')
	{
		dest++;
	}
	while (*dest++ = *src++)
		;
	return ret;
}

int main()
{
	char dest[20] = { "elon " };
	char src[] = { "musk" };
	char * ret = my_strcat(dest, src);
	//打印连接后的dest内容
	printf("%s\n", ret);
	return 0;
}

strcmp 的应用和模拟实现

strcmp详解:

先来看下官网对strcmp的介绍。

在这里插入图片描述

对返回值的介绍:

在这里插入图片描述
翻译后:
在这里插入图片描述

  • 绿色部分括号内为需要的两个参数.是要对比的两字符串的起始地址。
  • 两字符串的对比方法是逐位对比对应字符的ASCII码(\0 的ASCII值最小为 0)
  • 在逐位对比中最先出现的 ASCII小的那个字符所在字符串 即小于另一个字符串。
    eg: “abcdef” < “abd” 返回一个小于零的数
  • 最前面的 int 表明返回类型为 整形。

注意:用这个库函数时要引用头文件<string.h>

实例代码

int main()
{
	char str1[] = { "abc" };
	char str2[] = { "abd" };
	int ret = strcmp(str1, str2);
	//打印判断结果
	if (ret < 0)
	{
		printf("str1 < str2");
	}
	else if (ret > 0)
	{
		printf("str1 > str2");
	}
	else
	{
		printf("str1 = str2");
	}
	return 0;
}

运行结果

在这里插入图片描述

模拟实现:

int my_strcmp(char* str1, char* str2)
{
	//断言下两个指针非空
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 = '\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

int main()
{
	char str1[] = { "abc" };
	char str2[] = { "abd" };
	int ret = my_strcmp(str1, str2);
	//打印判断结果
	if (ret < 0)
	{
		printf("str1 < str2");
	}
	else if (ret > 0)
	{
		printf("str1 > str2");
	}
	else
	{
		printf("str1 = str2");
	}
	return 0;
}

今天内容到此结束,欢迎大家三连。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值