C语言- strcat(拼接函数的使用和模拟)

 strcat(拼接函数的使用和模拟)

strcat的语法

`strcat` 是 C 语言标准库中的一个字符串拼接函数,它用于将一个字符串(source)拼接到另一个字符串(destination)的末尾。该函数定义在 `<string.h>` 头文件中。
函数原型如下:

```c
char *strcat(char *dest, const char *source);
```

参数说明:
- `dest`:指向目标字符串的指针,拼接后的字符串将存储在这里。
- `source`:指向源字符串的指针,要拼接的字符串。
返回值:
- 函数返回指向目标字符串 `dest` 的指针。
功能:
- 将源字符串 `source` 的所有字符复制到目标字符串 `dest` 的末尾,直到遇到 null 字符(`'\0'`)为止。
- 在拼接过程中,如果目标字符串不以 null 字符结尾,`strcat` 会自动在其后面添加一个 null 字符,以确保拼接后的字符串以 null 字符结束。

示例代码:
```c
#include <stdio.h>
#include <string.h>
int main() {char dest[20] = "Hello"; // 确保这个数组足够大,能够存放拼接后的字符串char source[] = ", World!";// 使用 strcat 拼接字符串strcat(dest, source);printf("Concatenated string: %s\n", dest);return 0;
}
```
当运行上述代码时,它会输出:
```
Concatenated string: Hello, World!
```


注意事项:
- 与 `strcpy` 类似,`strcat` 也不会检查目标字符串数组是否有足够的空间来存放拼接后的字符串,因此同样要注意避免缓冲区溢出。
- 在实际项目中,为了安全起见,更推荐使用 `strncat` 函数,它允许你指定最大拼接的字符数,从而减少溢出的风险。
- 如果你需要在一个已存在的字符串后面添加一个特定的字符或字符串,可以使用 `strcpy` 和 `strcat` 的组合来实现。例如,如果你想在每个单词后面添加一个逗号和空格,你可以先用 `strcpy` 复制单词,然后手动添加逗号和空格。

也就是理解为

strcat(arr1(前面的函数),arr2(后面的函数))

也就是打印的 时候打印arr1就可以

而且是要给arr1 足够大的空间 这样才能保证后续工作的进行

函数来连接字符串

strcat的模拟

1 找到目标空间‘\0’

2 拷贝数据

3 目标空间可修改

所以简单的说就是先打印 再进行拷贝 两个循环

最后返回的是目标空间的起始地址,

简单的说就是

图解

库里面的参考实现代码

基本上差不多

代码版本1 

模拟实现 `strcat` 函数:
```c
char *my_strcat(char *dest, const char *source) {// 找到目标字符串的末尾char *dest_end = dest + strlen(dest);// 将源字符串的字符复制到目标字符串末尾while (*source) {*dest_end++ = *source++;}// 添加 null 字符,确保字符串以 null 字符结束*dest_end = '\0';// 返回指向目标字符串的指针return dest;
}
int main() {char dest[20] = "Hello";char source[] = ", World!";// 使用模拟的 my_strcat 拼接字符串dest = my_strcat(dest, source);printf("Concatenated string: %s\n", dest);return 0;
}
```
这个模拟实现的基本逻辑与标准库中的 `strcat` 相同,但它不依赖于标准库函数,可以作为了解字符串拼接内部实现的一种方式。

 代码版本2

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcat(char* arr1, char* arr2)
{assert(arr1 && arr2);char* ret = arr1;//首元素地址 方便返回首元素地址while (*arr1 != '\0')*arr1++;//这里的++不能写到循环里面 因为这里的++是对比之后进行++ 导致跳出循环 也就是等于当指针等于字符0的时候此时应该跳出循环 但是 ++ 导致又不等于0 指向的是'\0'的后一位while (*arr1 = *arr2){*arr1++; *arr2++;}*arr1 = *arr2;//这里也就是把'\0'放到结尾 其实放不放都可以 因为你已经完成任务 具体的目的要根据实际来进行写return ret;
}
int main()
{char arr1[100] = "slaidg ";//拼接的时候 需要注意 这里是常量字符创 也就无法改变空间的 所以 这里arr1的空间 要比arr2的空间大才行 不然会导致程序崩溃char arr2[] = "dfilsug ";strcat(arr1, arr2);printf("%s\n\n", arr1);char arr3[] = "dfilsug ";my_strcat(arr1, arr3);printf("%s\n\n", arr1);return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开箱即用之 windows部署jdk、设置nginx、jar自启

jdk安装 官网下载对应的安装包&#xff0c;解压之后放在本地指定的文件夹下 传送门https://www.oracle.com/java/technologies/downloads/#jdk21-windows 我比较喜欢下载zip方式的&#xff0c;解压之后直接能用&#xff0c;不需要安装了 配置环境 JAVA_HOME 添加path路径 …

Ubuntu 安装 KVM 虚拟化

1. Ubuntu 安装 KVM 虚拟化 KVM 是 Linux 内核中一个基于 hypervisor 的虚拟化模块&#xff0c;它允许用户在 Linux 操作系统上创建和管理虚拟机。 如果机器的CPU不支持硬件虚拟化扩展&#xff0c;是无法使用KVM(基于内核的虚拟机)直接创建和运行虚拟机的。此时最多只能使用…

3.Gen<I>Cam文件配置

Gen<I>Cam踩坑指南 我使用的是大恒usb相机&#xff0c;第一步到其官网下载大恒软件安装包,安装完成后图标如图所示&#xff0c;之后连接相机&#xff0c;打开软件&#xff0c;相机显示一切正常。之后查看软件的安装目录如图&#xff0c;发现有GenICam和GenTL两个文件&am…

ES解析word内容为空的问题和直接使用Tika解析文档的方案

导言 在上一篇文章最后&#xff0c;我们虽然跑通了ES文件搜索的全部流程&#xff0c;但是仍然出现了1个大的问题&#xff1a;ES7.3实测无法索引docx和doc文档&#xff0c;content有值但是无法解析到附件成为可读的可搜索的内容&#xff0c;附件内容为空&#xff08;附件中根本…

Mindlin厚板单元Matlab有限元编程 | 板单元 | 【Matlab源码 + 理论文本】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

Linux_初识网络协议

网络协议 数据传输 发明计算机的目的是为了计算数据&#xff0c;结果有可能自己用&#xff0c;也有可能交给其他人使用&#xff0c;所以就需要多台计算机之间可以互相通信。按照通信距离&#xff0c;计算机网络大体分为&#xff1a;局域网(LAN)和广域网(WAN)。如果两台计算机距…

尼伽OLED透明屏闪耀第24届中国零售业博览会,引领零售行业革新

2024 CHINA SHOP 第二十四届中国零售业博览会 3.13-15 上海 3.13-15日&#xff0c;第24届中国零售业博览会盛大开幕&#xff0c;起立科技&#xff08;旗下品牌&#xff1a;起鸿、尼伽&#xff09;携其自主研发的30寸OLED透明屏和移动AI透明屏机器人惊艳亮相&#xff0c;成为展…

【iOS ARKit】PhysicsBodyComponent

在学习完 RealityKit 进行物理模拟的相关理论知识后&#xff0c;下面通过使用 PhysicsBodyComponent 组件进行物理模拟演示&#xff0c;主要代码如下所示&#xff0c;稍后对代码进行详细解析。 // // PhysicsBodyView.swift // ARKitDeamo // // Created by zhaoquan du on…

浅易理解:非极大抑制NMS

什么是非极大抑制NMS 非极大值抑制&#xff08;Non-Maximum Suppression&#xff0c;简称NMS&#xff09;是一种在计算机视觉和图像处理领域中广泛使用的后处理技术&#xff0c;特别是在目标检测任务中。它的主要目的是解决目标检测过程中出现的重复检测问题&#xff0c;即对于…

租房网站|基于springboot框架+ Mysql+Java+B/S架构的租房网站设计与实现(可运行源码+数据库+设计文档+部署说明)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 用户功能模块 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参…

三种方式使用纯 CSS 实现星级评分

本文介绍三种使用纯 CSS 实现星级评分的方式。每种都值得细品一番~ 五角星取自 Element Plus 的 svg 资源 <svg xmlns"http://www.w3.org/2000/svg" viewBox"0 0 1024 1024" style""><pathfill"currentColor"d"M283.84 …

分析型数据库的主要使用场景有哪些?

如今数据已经成为了企业和组织的核心资产。如何有效地管理和利用这些数据&#xff0c;成为了决定竞争力的关键。分析型数据库作为数据处理领域的重要工具&#xff0c;为各行各业提供了强大的数据分析和洞察能力。基于分析型数据库&#xff08;Apache Doris &#xff09;构建的现…