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

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

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

相关文章

Java开发从入门到精通(九):Java的面向对象OOP:成员变量、成员方法、类变量、类方法、代码块、单例设计模式

Java大数据开发和安全开发 &#xff08;一)Java的变量和方法1.1 成员变量1.2 成员方法1.3 static关键字1.3.1 static修饰成员变量1.3.1 static修饰成员变量的应用场景1.3.1 static修饰成员方法1.3.1 static修饰成员方法的应用场景1.3.1 static的注意事项1.3.1 static的应用知识…

基于暗通道的图像去雾算法,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供有偿…

MongoDB简单CRUD操作(含GO中的库操作)

MongoDBCRUD操作&#xff08;含GO中的库操作&#xff09; 这周开始尝试做新项目&#xff0c;涉及到了文章的存储&#xff0c;查了查MongoDB在这方面用的比较多&#xff0c;因此对MongoDB和他在Golang中的用法进行了学习&#xff0c;以下是我的整理 文章目录 MongoDBCRUD操作&a…

IDEA中的Project工程、Module模块的概念及创建导入

1、IDEA中的层级关系&#xff1a; project(工程) - module(模块) - package(包) - class(类)/接口具体的&#xff1a; 一个project中可以创建多个module一个module中可以创建多个package一个package中可以创建多个class/接口2、Project和Module的概念&#xff1a; 在 IntelliJ …

vue3模块化引用组件和引用ts,调用ts中的接口

以简单的登录功能为例子 1.在util中创建loginValidators.ts import { ref, reactive } from vueinterface User{email: string;password: string; }export const loginUserreactive<User>({email: ,password: })interface Rules{email: {required: boolean;message: …

Html提高——HTML5 新增的语义化标签

引入&#xff1a; 以前布局&#xff0c;我们基本用 div 来做。div 对于搜索引擎来说&#xff0c;是没有语义的。 但是在html5里增加了语义化标签&#xff0c;如 <header>&#xff1a;头部标签 <nav>&#xff1a;导航标签 <article>&#xff1a;内容标签 &…

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

用来展示列表具体item&#xff0c;必须配合List来使用。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。该组件的父组件只能是List或者ListItemGroup。 子组件 可以包含单个子组件。 接口 从API…

[江苏工匠杯]easyphp

先看源码 <?php highlight_file(__FILE__); $key1 0; $key2 0; ​ $a $_GET[a]; $b $_GET[b]; ​ if(isset($a) && intval($a) > 6000000 && strlen($a) < 3){if(isset($b) && 8b184b substr(md5($b),-6,6)){$key1 1;}else{die("…

遗传算法及基于该算法的典型问题的求解实践

说明 遗传算法是一个很有用的工具&#xff0c;它可以帮我们解决生活和科研中的诸多问题。最近在看波束形成相关内容时了解到可以用这个算法来优化阵元激励以压低旁瓣&#xff0c;于是特地了解和学习了一下这个算法&#xff0c;觉得蛮有意思的&#xff0c;于是把这两天关于该算法…

大模型训练准备工作

一、目录 1 大模型训练需要多少算力&#xff1f; 2. 大模型训练需要多少显存&#xff1f; 3. 大模型需要多少数据量训练&#xff1f; 4. 训练时间估计 5. epoch 选择经验 6. 浮点计算性能测试 二、实现 1 大模型训练需要多少算力&#xff1f; 训练总算力&#xff08;Flops&…

分割等和子集 最后一块石头的重量II 目标和

416. 分割等和子集 力扣题目链接 本题中每一个元素的数值既是重量&#xff0c;也是价值。 dp[j]表示 背包总容量&#xff08;所能装的总重量&#xff09;是j&#xff0c;放进物品后&#xff0c;背的最大重量为dp[j] 如果背包容量为target&#xff0c; dp[target]就是装满 背…

helm部署hadoop

&#xff08;作者&#xff1a;陈玓玏&#xff09; 参考helm仓库的文档&#xff1a;https://artifacthub.io/packages/helm/apache-hadoop-helm/hadoop helm helm repo add pfisterer-hadoop https://pfisterer.github.io/apache-hadoop-helm/ helm install hadoop pfistere…

机器学习 --- 模型评估、选择与验证

Java实训代码、答案&#xff0c;如果能够帮到您&#xff0c;希望可以点个赞&#xff01;&#xff01;&#xff01; 如果有问题可以csdn私聊或评论&#xff01;&#xff01;&#xff01;感谢您的支持 第1关&#xff1a;为什么要有训练集与测试集 1、下面正确的是&#xff1f;&…

升入理解计算机系统学习笔记

磁盘存储 磁盘是广为应用的保存大量数据的存储设备&#xff0c;存储数据的数量级可以达到几百到几千千兆字节&#xff0c;而基于RAM的存储器只能有几百或几千兆字节。不过&#xff0c;从磁盘上读信息的时间为毫秒级&#xff0c;比从DRAM读慢了10万倍&#xff0c;比从SRAM读慢了…

《剑指 Offer》专项突破版 - 面试题 79 ~ 84 : 详解回溯法(C++ 实现)

目录 一、回溯法的基础知识 二、集合的排列、组合 面试题 79 : 所有子集 面试题 80 : 包含 k 个元素的组合 面试题 81 : 允许重复选择元素的组合 面试题 82 : 包含重复元素集合的组合 面试题 83 : 没有重复元素集合的全排列 面试题 84 : 包含重复元素集合的全排列 一、…

wsl中安装虚拟环境virtualenv,pycharm中配置wsl解释器

wsl 中安装虚拟环境 virtualenv 注意&#xff1a; 不能将虚拟环境安装到 /root 目录下&#xff0c;在 window 文件管理中&#xff0c;没有权限访问 wsl 中的 /root 目录 安装虚拟环境 sudo pip install virtualenv sudo pip install virtualenvwrapper配置环境变量 1、创建…

基于单片机的指纹打卡机设计

摘要 在科学技术飞速发展的今天&#xff0c;社会对身份识别的要求越来越高&#xff0c;尤其是在企业管理的人员签到、工作考勤等活动中对身份识别的高效性和可靠性的需求更为迫切。而传统的个人身份识别手段&#xff0c;如钥匙、密码、IC卡等&#xff0c;由于具有可盗用、可伪…

深入理解TCP:序列号、确认号和自动ACK的艺术

深入理解TCP&#xff1a;序列号、确认号和自动ACK的艺术 在计算机网络的世界里&#xff0c;TCP&#xff08;传输控制协议&#xff09;扮演着至关重要的角色。它确保了数据在不可靠的网络环境中可靠地、按顺序地传输。TCP的设计充满智慧&#xff0c;其中序列号&#xff08;Seq&a…

续上篇 qiankun 微前端配置

上篇文章地址&#xff1a;微前端框架 qiankun 配置使用【基于 vue/react脚手架创建项目 】-CSDN博客 主应用&#xff1a; src/main.js 配置&#xff1a; import Vue from vue import App from ./App.vue import router from ./router import { registerMicroApps, start } …

Jenkins内部使用Docker

修改docker.sock文件权限 路径在&#xff1a;/var/run/docker.sock 进入/var/run目录下 修改docker.sock文件权限&#xff0c;且让其他用户也可以读写。 cd /var/run chown root:root docker.sock chmod orw docker.sock 修改数据卷映射 切换到你Jenkins的docker-compose.…