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

导读:本篇文章讲解 【字符串函数内功修炼】strcpy + strcat + strcmp(一),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

在这里插入图片描述

在这里插入图片描述

🌟 前言

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

🌟 运行结果

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/80870.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!