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


    在这里插入图片描述

    在这里插入图片描述

    🌟 前言

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

    1. strcpy - 字符串拷贝

    🍑 函数介绍

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

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

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

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

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

    5、目标空间必须可变;

    📝 代码示例

    #include 
    #include 
    
    int main()
    {
    	char str1[] = "hawkeye";
    	char str2[20] = "EEEEEEEEEEEEEEEE";
    
    	strcpy(str2, str1);
    	printf("%s\n", str2);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    运行结果

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

    🍑 模拟实现

    📝 代码示例

    #include 
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    🌟 运行结果

    在这里插入图片描述

    📝 代码升级

    #include 
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    因为是后置 ++,所以 *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

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

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

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

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

    5、目标空间必须可变。

    📝 代码示例

    #include 
    #include 
    
    int main()
    {
    	char str1[30] = "hello";
    	char str2[] = "world";
    	strcat(str1, str2);
    	printf("%s\n", str1);
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    🌟 运行结果

    在这里插入图片描述

    🍑 模拟实现

    📝 代码示例

    #include 
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    🌟 运行结果

    在这里插入图片描述

    3. strcmp - 字符串比较

    🍑 函数介绍

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

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

    比较规定:

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

    📝 代码示例

    #include 
    #include 
    
    int main()
    {
    	char str1[] = "abcdef";
    	char str2[] = "bbq";
    
    	int ret = strcmp(str1, str2);
    
    	printf("%d\n", ret);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    🌟 运行结果

    在这里插入图片描述

    🍑 模拟实现

    📝 代码示例

    #include 
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    🌟 运行结果

    在这里插入图片描述

    📝 代码升级

    #include 
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    🌟 运行结果

    在这里插入图片描述

  • 相关阅读:
    pycharm运行命令的时候出现的问题
    直接插入排序
    Data Augmentation
    计算机毕业设计Java白天鹅造型网(源码+系统+mysql数据库+lw文档)
    vue父组件调用子组件的方法 或传递值给子组件
    ArrayList#subList这四个坑,一不小心就中招
    flask+python快速搭建
    如何理解相位噪声与时间抖动的关系?
    [ 云计算 Azure ] Chapter 07 | Azure 网络服务中的虚拟网络 VNet、网关、负载均衡器 Load Balancer
    数说方法论:针对个体消费者做批量定制化营销
  • 原文地址:https://blog.csdn.net/m0_63325890/article/details/125601790