C语言学习NO.12-字符函数(二)-strcpy,strcat,strcmp长度不受限制的字符串函数

一、strcpy的使用和模拟实现

(一)strcpy使用

//strcpy的使用
#include <stdio.h>

int main()
{
	char arr1[] = "abcdef";
	char arr2[10] = "qwertt";
	char arr3[10] = "okl";
	strcpy(arr2, arr1);
	printf("arr2 = %s\n", arr2); 
	strcpy(arr2, arr3);
	printf("arr1 = %s\narr2 = %s\narr3 = %s", arr1,arr2,arr3);
	return 0;
}

(二)strcpy使用的注意事项

• 注意strcpy需要包含的头文件是 <string.h>

• 源字符串必须以 '\0' 结束,会将源字符串中的 '\0' 拷贝到目标空间。

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

• 目标空间必须可修改。

•strcpy函数返回的是目标空间的起始地址

如下例,字符中的'\0'也会同样被赋值进目标空间。

#include <stdio.h>

int main()
{
	char arr1[] = "xxxxxxxxxx";
	char arr2[] = "abc";

	strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

当源字符串空间大于目标空间时,使用strcpy函数会有怎样的结果?

系统会报错。

#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[] = "xxxxxxxxxx";
	char arr2[] = "abc";

	strcpy(arr2, arr1);
	printf("%s", arr2);
	return 0;
}

(三)strcpy的模拟实现

strcpy函数返回的是目标空间的起始地址

strcpy函数的返回类型的设置是为了实现链式访问

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

char *my_strcpy(char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str2)
	{
		*str1 = *str2;
		++str1;
		++str2;
		if (*str2 == '\0')
			*str1 = *str2;
	}
	return str1;
}

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "qwert";
	my_strcpy(arr1,arr2);
	printf("%s", arr1);
	return 0;
}

进行优化

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

char* my_strcpy(char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1++ = *str2++)
	{
		;
	}
	return str1;
}

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "qwert";
	my_strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

二、strcat的使用和模拟实现

(一)strcat使用

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

int main()
{
	char arr1[20] = "abcdef";
	char arr2[] = "poiuy";
	strcat(arr1, arr2);
	printf("arr1=%s\narr2=%s", arr1, arr2);
	return 0;
}

(二)strcat使用的注意事项

  • 注意strcpy需要包含的头文件是 <string.h>
  • 源字符串必须以 '\0' 结束。
  • 目标空间必须有足够的大,能容纳下源字符串的内容。
  • 目标空间必须可修改。

(三)strcat的模拟实现

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

char* my_strcat(char* dest, char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*dest)//找目标字符串中的'\0'
	{
		dest++;
	}
	while (*dest++ = *src++)//附加字符串
	{
		;
	}
	return ret;
}


int main()
{
	char arr1[20] = "asdfg";
	char arr2[] = "mnbvc";

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

(四)字符串自身附加

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

char* my_strcat(char* dest, char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*dest)//找目标字符串中的'\0'
	{
		dest++;
	}
	while (*dest++ = *src++)//附加字符串
	{
		;
	}
	return ret;
}

int main()
{
	char arr[20] = "asdfg";
	my_strcat(arr, arr);
	printf("%s", arr);
	return 0;
}

存在错误,自身附加自身的字符串时,字符串的'\0'很容易被覆盖。

三、strcmp的使用和模拟实现

(一)strcmp使用

#include <stdio.h>
#include <string.h>
int main()

{
	char arr1[] = "asdfgh";
	char arr2[] = "ascfgh";
	char arr3[] = "asdfghj";
	char arr4[] = "asdfghj";
	int ret1 = strcmp(arr2, arr1);
	int ret2 = strcmp(arr3, arr1);
	int ret3 = strcmp(arr2, arr3);
	int ret4 = strcmp(arr4, arr3);
	printf("%d %d %d %d", ret1, ret2, ret3,ret4);

	return 0;
}

(二)strcmp使用的注意事项

  • 此函数开始比较每个字符串的第一个字符。如果它们彼此相等则继续比较后续的字符相应,直到字符不同或终止达到null字符。
  • 标准规定
    • 第一个字符串大于第二个字符串,则返回大于0的数字
    • 第一个字符串等于第二个字符串,则返回0
    • 第一个字符串小于第二个字符串,则返回小于0的数字

(三)strcmp的模拟实现


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

int* my_strcmp(char* s1, const char* s2)
{
	assert(s1 && s2);
	while (*s1 == *s2)
	{
		if(*s1 == '\0')
			return 0;
		s1++;
		s2++;
	}
	if (*s1 > *s2)
		return 1;
	else
		return -1;
}

int main()
{
	char arr1[] = "asdfgh";
	char arr2[] = "asdfg";

	int ret = my_strcmp(arr1, arr2);
	printf("%d", ret);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/296948.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构和算法-插入排序(算法效率 折半优化 顺序表与链表插入排序 代码实现)

文章目录 插入排序算法实现算法效率分析优化-折半插入排序代码实现对链表进行插入排序小结 插入排序 首先49当作第一个已经排好序得元素&#xff0c;将第二个元素与前面得元素对比&#xff0c;发现小于49&#xff0c;于是49移动位置 此时将65与之前元素对比&#xff0c;发现其…

玩转Python:用Python处理文档,5个必备的库,特别实用,附代码

在Python中&#xff0c;有几个流行的库用于处理文档&#xff0c;包括解析、生成和操作文档内容。以下是一些常用的库及其简介和简单的代码示例&#xff1a; PyPDF2 - 用于处理PDF文件。 简介&#xff1a;PyPDF2是一个纯Python库&#xff0c;用于分割、合并、转换和提取PDF文件中…

C#,入门教程(09)——运算符的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(08)——基本数据类型及使用的基础知识https://blog.csdn.net/beijinghorn/article/details/123906998 一、算术运算符号 算术运算符号包括&#xff1a;四则运算 加 , 减-, 乘*, 除/与取模%。 // 加法&#xff0c;运算 int va 1 …

移动神器RAX3000M路由器不刷固件变身家庭云之六(高级应用):设置https

本系列文章&#xff1a; 移动神器RAX3000M路由器变身家庭云之一&#xff1a;开通SSH&#xff0c;安装新软件包 移动神器RAX3000M路由器变身家庭云之二&#xff1a;安装vsftpd 移动神器RAX3000M路由器变身家庭云之三&#xff1a;外网访问家庭云 移动神器RAX3000M路由器变身家庭云…

洗地机有必要买吗?2024好用的洗地机推荐

洗地机有必要吗&#xff1f;单答案是肯定的&#xff01;传统的家务劳动真的是耗时又枯燥&#xff0c;特别是地面清洁。要先扫一遍灰&#xff0c;然后用湿拖把先把地面全拖一遍&#xff0c;然后用干拖把把水渍再推一遍&#xff0c;最后还要忍着恶心去清洗拖把&#xff0c;费时费…

全网最全stable diffusion模型讲解!快来!!小白必收藏!!

手把手教你入门绘图超强的AI绘画程序Stable Diffusion&#xff0c;用户只需要输入一段图片的文字描述&#xff0c;即可生成精美的绘画。给大家带来了全新Stable Diffusion保姆级教程资料包&#xff08;文末可获取&#xff09; AI模型最新展现出的图像生成能力远远超出人们的预…

企业机密文件防泄密解决方案(具体执行时间表)

企业的机密文件是其核心竞争力的重要组成部分。一旦机密文件泄露&#xff0c;可能会给企业带来重大的经济损失和声誉损害。因此&#xff0c;企业需要采取有效的措施来保护机密文件的安全性。本文将介绍一种企业机密文件防泄密解决方案&#xff0c;帮助企业提高信息安全防护能力…

CentOS 8 8.5.2111 网络在线安装系统 —— 筑梦之路

之前写过一篇关于centos 8 官方停止更新维护后解决yum源问题的文章&#xff1a; CentOS 8 停止维护后换可用yum源——筑梦之路_http://ftp.iij.ad.jp/pub/linux/centos-vault/8.5.21-CSDN博客 由于centos 8 dvd的镜像比较大&#xff0c;有时候我们根本不需要去下载一个10G以上…

【数据库原理】(9)SQL简介

一.SQL 的发展历史 起源&#xff1a;SQL 起源于 1970 年代&#xff0c;由 IBM 的研究员 Edgar F. Codd 提出的关系模型概念演化而来。初期&#xff1a;Boyce 和 Chamberlin 在 IBM 开发了 SQUARE 语言的原型&#xff0c;后发展成为 SQL。这是为了更好地利用和管理关系数据库。…

iOS 解决push证书不受信任

重新下载&#xff1a;https://www.apple.com/certificateauthority/

手把手带你门SpringCloud

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是平顶山大师&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《手把手带你门SpringCloud开发之入门级及nacos…

在Flyway执行数据库脚本之前创建数据库

Flyway让我们不用手动执行sql脚本&#xff0c;但是众所周知&#xff0c;前提是要先创建项目的数据库。为了能够让运维的同事再偷一次懒&#xff0c;通过代码来自动完成数据库的创建&#xff0c;于是有了这篇文章的分享~ 要实现这个效果&#xff0c;只需要两步&#xff1a; 第一…

【Python机器学习】线性模型——lasso

除了岭回归&#xff0c;还有一种正则化的线性回归是lasso&#xff0c;与岭回归相同&#xff0c;使用lasso也是约束系数使其接近于0&#xff0c;但方法不同&#xff0c;叫做L1正则化。L1正则化的结果是使用lasso时某些系数刚好为0。说明某些特征被模型完全忽略。 同样以波士顿房…

企业防泄密软件超全图文解析!快来看!

防泄密软件作为保障企业信息安全的重要工具&#xff0c;其重要性不言而喻。本文将为您解析企业防泄密软件的方方面面&#xff0c;帮助您了解如何选择适合自己企业的防泄密软件。 一、泄密的渠道有哪些 1、外部入侵&#xff1a;黑客攻击、病毒感染等外部因素可能导致企业的数据…

Vue脚手架及组件开发

组件插槽: 路由数据传递&#xff1a;

ubuntu20.04安装cuda11.7和显卡驱动

1、禁用nouveau sudo vi /etc/modprobe.d/nouveau.conf 在最下面加入blacklist nouveau sudo update-initramfs -u sudo reboot 输入命令&#xff0c;如果没有任何输出&#xff0c;证明禁用成功 lsmod | grep nouveau 2、安装cuda11.7 CUDA Toolkit Archive | NVIDIA Deve…

ubuntu 22 virt-manger(kvm)安装winxp; ubuntu22体验 firebird3.0

安装 、启动 virt-manager sudo apt install virt-manager sudo systemctl start libvirtdsudo virt-manager安装windowsXP 安装过程截图如下 要点1 启用 “包括寿终正寝的操作系统” win_xp.iso 安装过程 &#xff1a; 从winXp.iso启动, 执行完自己重启从硬盘重启&#xff0c…

高压放大器输出接法及其注意事项

高压放大器应用场景非常广泛&#xff0c;非常适用于半导体高压驱动、TFT产业高压驱动、各种高压工程等应用&#xff1b;也很适用当作音频信号产生器或函数波形产生器的波形放大使用。使用场景广泛&#xff0c;放大器的输出接法也多种&#xff0c;对于不同的放大器也有对应的输出…

【漏洞复现】ActiveMQ反序列化漏洞(CVE-2015-5254)

Nx01 产品简介 Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件。ActiveMQ是消息队列服务&#xff0c;是面向消息中间件&#xff08;MOM&#xff09;的最终实现&#xff0c;它为企业消息传递提供高可用、出色性能、可扩展、稳定和安全保障。 Nx02 漏洞描述 Re…

怎么做表单二维码来获取用户数据?扫码填表的制作方法

​怎么用二维码来收集其他人的信息&#xff0c;比如用户反馈、信息采集、问卷调查等等&#xff0c;都是现在表单二维码的常见应用方式。那么如果我们想制作一个表单二维码用来采集其他人员的反馈信息&#xff0c;用二维码生成器来制作的步骤有哪些呢&#xff1f;下面来教大家在…