【字符串函数内功修炼】strcpy + strcat + strcmp(一)

在这里插入图片描述

在这里插入图片描述

🌟 前言

C 语言中对字符和字符串的处理很是频繁,但是 C 语言本身是没有字符串类型的,字符串通常放在 常量字符串 中或者 字符数组 中。
 
字符串常量 适用于那些对它不做修改的字符串函数;
 
本篇将重点介绍处理 字符字符串 的库函数的使用和注意事项👇
在这里插入图片描述

1. strcpy - 字符串拷贝

🍑 函数介绍

char* strcpy(char* Destination, const char* Source);

1、strcpy 是将 Source 字符串 的内容拷贝到 Destination 字符串 中;

2、源字符串必须以 \0 结束;

3、会将源字符串中的 \0 一并拷贝到 目标 空间;

4、目标空间必须足够大,以确保能存放源字符串;

5、目标空间必须可变;

📝 代码示例

#include <stdio.h>
#include <string.h>

int main()
{
	char str1[] = "hawkeye";
	char str2[20] = "EEEEEEEEEEEEEEEE";

	strcpy(str2, str1);
	printf("%s\n", str2);
	return 0;
}

运行结果

可以看到 \0 也是拷贝到 str2 中了
在这里插入图片描述

🍑 模拟实现

📝 代码示例

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

char* my_strcpy(char* dest, const char* src) {
	char* start = dest;
	assert(dest && src);
	while (*src) {
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src; //此时src中还剩下\0,赋值给dest
	return start;
}

int main()
{
	char str1[] = "hawkeye";
	char str2[20] = "EEEEEEEEEEEEEEEE";

	my_strcpy(str2, str1);
	printf("%s\n", str2);
	return 0;
}

🌟 运行结果

在这里插入图片描述

📝 代码升级

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

char* my_strcpy(char* dest, const char* src) {
	char* start = dest;
	assert(dest && src);
	while (*dest++ = *src++) {
		;
	}
	return start;
}

int main()
{
	char str1[] = "hawkeye";
	char str2[20] = "EEEEEEEEEEEEEEEE";

	my_strcpy(str2, str1);
	printf("%s\n", str2);
	return 0;
}

因为是后置 ++,所以 *src 的内容先放到 *dest 中,然后 dest++src++,就找到了第二个元素的地址…以此类推;

src 指向 \0 时,src 赋值给 dest,此时 while 循环里面整个表达式的结果就是 \0,而 \0ASCII 码值是 0,所以循环就停下来了;

为什么要定义 strat 呢?

因为 strcpy 返回的是 目标字符串 的起始地址,而当 while 循环结束以后,dest 不再是起始地址了;

所以事先保存一份 dest 的起始地址到 strat 中。

🌟 运行结果

在这里插入图片描述

2. strcat - 字符串追加

🍑 函数介绍

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

1、strcat 是用来 连接接字符串 的,它会将参数 source 字符串复制到参数 dest 所指的字符串尾部。

2、源字符串必须以 \0 结束。

3、会将源字符串中的 \0 拷贝到目标空间。

4、目标空间必须足够大,以确保能存放源字符串。

5、目标空间必须可变。

📝 代码示例

#include <stdio.h>
#include <string.h>

int main()
{
	char str1[30] = "hello";
	char str2[] = "world";
	strcat(str1, str2);
	printf("%s\n", str1);

	return 0;
}

🌟 运行结果

在这里插入图片描述

🍑 模拟实现

📝 代码示例

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

char* my_strcat(char* dest, const char* src) {
	char* start = dest;
	assert(dest && src);
	//1. 目标空间中的\0
	while (*dest) {
		dest++;
	}
	//2. 追加内容到目标空间
	while (*dest++ = *src++) {
		;
	}
	return start;
}

int main()
{
	char str1[30] = "hello";
	char str2[] = "world";
	my_strcat(str1, str2);
	printf("%s\n", str1);

	return 0;
}

🌟 运行结果

在这里插入图片描述

3. strcmp - 字符串比较

🍑 函数介绍

int strcmp(const char* str1, const char* str2);

strcmp 用于对 两组字符串进行比较 的函数,比较的是对应位置上的字符大小,它的返回值是 int 类型。

比较规定:

  1. 第一个字符串大于第二个字符串,则返回大于 0 的数字;
  2. 第一个字符串等于第二个字符串,则返回 0
  3. 第一个字符串小于第二个字符串,则返回小于 0 的数字

📝 代码示例

#include <stdio.h>
#include <string.h>

int main()
{
	char str1[] = "abcdef";
	char str2[] = "bbq";

	int ret = strcmp(str1, str2);

	printf("%d\n", ret);
	return 0;
}

🌟 运行结果

在这里插入图片描述

🍑 模拟实现

📝 代码示例

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

int my_strcmp(const char* str1, const char* str2) {
	assert(str1 && str2);
	while (*str1 == *str2) {
		//如果两个字符串相等,把某个字符串的\0,拿去返回
		if (*str1 == '\0') {
			return 0;
		}
		str1++;
		str2++;
	}
	if (*str1 > *str2) {
		return 1;
	}
	else {
		return -1;
	}
}

int main()
{
	char str1[] = "abz";
	char str2[] = "abq";

	int ret = my_strcmp(str1, str2);

	printf("%d\n", ret);
	return 0;
}

🌟 运行结果

在这里插入图片描述

📝 代码升级

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

int my_strcmp(const char* str1, const char* str2) {
	assert(str1 && str2);
	while (*str1 == *str2) {
		//如果两个字符串相等,说明他们都已经走到\0的位置
		//然后\0 = \0,进行循环,直接进入if语句
		if (*str1 == '\0') {
			return 0;
		}
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

int main()
{
	char str1[] = "abcdef";
	char str2[] = "bbq";

	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;
}

🌟 运行结果

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Albert Edison

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

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

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

打赏作者

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

抵扣说明:

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

余额充值