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

news2025/1/10 17:01:10

 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.coloradmin.cn/o/1520385.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习介绍

监督学习 监督学习涉及使用某种算法来分析过去的观察并从中学习&#xff0c;从而使您能够预测未来的事件。 监督学习的目标是提出或推断出一种近似映射函数&#xff0c;该函数可以应用于一个或多个输入变量&#xff0c;并产生输出变量或结果。 训练过程涉及采用非特征和标签的…

3.14号arm

1. 计算机基础理论 1.1 计算机的组成 输入设备&#xff1a;将数据转换成计算机可以识别&#xff0c;存储&#xff0c;处理的形式&#xff0c;发送到计算机中 输出设备&#xff1a;将计算机对程序和数据的运算结果输送到外部的设备 存储器&#xff1a;用于将数据保存的模块。 …

代码随想录刷题day24|回溯理论基础组合问题

文章目录 day24学习内容一、修剪二叉搜索树1.1、什么是回溯法1.2、递归与回溯1.3、回溯法的效率1.4、回溯法解决的问题类型1.5、如何理解回溯法1.6、回溯算法模板 二、组合问题2.1、思路2.2、正确写法-没有剪枝2.2.1、为什么不能写i < n2.2.2、为什么不能写startIndex02.2.3…

phpcms头像上传漏洞引发的故事

目录 关键代码 第一次防御 第一次绕过 第二次防御 第二次绕过 第三次防御 第三次绕过 如何构造一个出错的压缩包 第四次防御 第四次绕过 本篇文章是参考某位大佬与开发人员对于文件包含漏洞的较量记录下的故事&#xff0c;因为要学习文件包含漏洞&#xff0c;就将大佬…

什么是 HTTPS?它是如何解决安全性问题的?

什么是 HTTPS&#xff1f; HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是一种安全的通信协议&#xff0c;用于在计算机网络上安全地传输超文本&#xff08;如网页、图像、视频等&#xff09;和其他数据。它是 HTTP 协议的安全版本&#xff0c;通过使用加…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Grid)

网格容器&#xff0c;由“行”和“列”分割的单元格所组成&#xff0c;通过指定“项目”所在的单元格做出各种各样的布局。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 仅支持GridItem…

定时执行专家:自动截屏功能在电脑监控中的卓越应用

一、软件简介 定时执行专家&#xff0c;作为一款专业级的定时任务执行软件&#xff0c;不仅功能强大&#xff0c;而且操作简便。它支持25种任务类型&#xff0c;其中自动截屏功能尤为出色。通过这一功能&#xff0c;用户可以设定定时自动截取电脑屏幕&#xff0c;从而实现对电…

Java微服务轻松部署服务器

我们在日常开发微服务之后需要再服务器上面部署&#xff0c;那么如何进行部署呢&#xff0c;先把微服务的各个服务和中间件以及对应的端口列举出来&#xff0c;都打包成镜像&#xff0c;以及前端代码部署的nginx&#xff0c;使用docker-compose启动&#xff0c;访问服务器nginx…

系统重构后,对项目定制开发的兼容性问题

公司自实施产品线战略以来&#xff0c;基本推翻了全部旧有业务模块。后续以标准产品二次开发的模式进行项目开发。但在涉及到一些旧有系统二期、三期升级改造过程中。不可避免的需要解决旧有系统的客户定制化开发兼容性问题。也就是旧有系统定制开发的模块不能丢弃。重新开发从…

C++Qt学习——QPushButton、QRadioButton(单选按钮)、QCheckBox(复选按钮)

目录 1、QPushButton 1.1、创建一个新的项目&#xff0c;转到UI界面拖一个Push Button 1.2、Push Button的常用信号主要有四个&#xff0c;分别为 clicked(), pressed(), released(), toggled() 1.2.1、按住Push Button右键转到槽&#xff0c;选择信号函数 1.2.2、在Widget…

国创证券|资源再生概念持续活跃,超越科技两连板,大地海洋等走高

资源再生概念15日盘中再度走强&#xff0c;截至发稿&#xff0c;超越科技涨停斩获两连板&#xff0c;深水海纳涨超14%&#xff0c;大地海洋涨超12%&#xff0c;华新环保涨近9%&#xff0c;天奇股份、格林美、怡球资源等涨超5%。 消息面上&#xff0c;3月13日&#xff0c;国务院…

解决jsp request.getParameter乱码问题(兼容Tomcat 6~8三个版本)

JSP页面写法&#xff1a; <% page contentType"text/html; charsetutf-8" language"java" %> <% page import"java.io.*" %> <%! int getServerVersion(HttpServletRequest request) {ServletContext application request.getS…

前端组件化:构建高效应用的艺术

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

LeetCode每日一题——两数之和

两数之和OJ链接&#xff1a;1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 思路&#xff1a; 在读懂题目后很多人觉得这种题目很简单&#xff0c;但是不管怎么写&#xff0c;在VS等其他编译器上能跑成功&#xff0c;但是在LeetCode上就是没办法通过。…

Learn OpenGL 08 颜色+基础光照+材质+光照贴图

我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色&#xff0c;而是它所反射的(Reflected)颜色。物体的颜色为物体从一个光源反射各个颜色分量的大小。 创建光照场景 首先需要创建一个光源&#xff0c;因为我们以及有一个立方体数据&#xff0c;我们只需要进行…

【论文阅读笔记】Attention Is All You Need

1.论文介绍 Attention Is All You Need 2017年 NIPS transformer 开山之作 回顾一下经典&#xff0c;学不明白了 Paper Code 2. 摘要 显性序列转导模型基于包括编码器和解码器的复杂递归或卷积神经网络。性能最好的模型还通过注意力机制连接编码器和解码器。我们提出了一个新…

Redis部署方式(三)主从模式

在前面单机版的基础上&#xff0c;41为主&#xff0c;30为从。 一、主从搭建 1、主Redis安装 41机器redis主要配置 requirepass redis#!_41 bind 0.0.0.0 port 6379 daemonize yes 2、从redis安装 30机器redis主要配置 requirepass redis#!_30 bind 0.0.0.0 port 6380 da…

Oracle 部署及基础使用

1. Oracle 简介 Oracle Database&#xff0c;又名 Oracle RDBMS&#xff0c;简称 Oracle Oracle系统&#xff0c;即是以Oracle关系数据库为数据存储和管理作为构架基础&#xff0c;构建出的数据库管理系统。是目前最流行的客户/服务器&#xff08;client/server&#xff09;或…

关于Transfomer的思考

为何诞生 在说transformer是什么&#xff0c;有什么优势之类的之前&#xff0c;先谈一谈它因何而诞生。transformer诞生最重要的原因是早先的语言模型&#xff0c;比如RNN&#xff0c;由于其本身的训练机制导致其并行度不高&#xff0c;特别是遇到一些长句子的情况下。其次&…

面试题手撕篇

参考博客 开始之前&#xff0c;理解递归 手写 浅拷贝 function shallow(target){if(target instanceof Array){return [...resObj]}else{return Object.assign({},target);} }手写深拷贝 const _sampleDeepClone target > {// 补全代码return JSON.parse(JSON.stringify…