(C语言)strcat函数详解与模拟实现与strncat函数详解

目录

1. strcat函数详解

1. strcat函数模拟实现

3. strcat函数的危险性

4. strncat函数详解

4.1 strncat函数的特殊情况验证


1. strcat函数详解

头文件<string.h>

该函数是用来对字符串末尾追加字符串的,有两个参数,destination是要被追加的字符串,source是要追加的字符串,函数返回destination

演示:

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

int main()
{
	char arr1[] = { "abcdef" };
	char arr2[10] = { "abc" };
	strcat(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

结果是:

在arr2后追加了arr1的内容,但追加后arr2后是否还有\0呢我们来看一下

可见strcat从arr2可中第一个\0开始追加,无论后面还有没有数据,并且arr2后面是被主动加了一个\0,

1. strcat函数模拟实现

代码:

#include <assert.h>
char* my_strcat(char* dest, const char* sour)
{
	assert(dest && sour != NULL);
	char* p = dest;
	while (*dest != '\0')
	{
		dest++;
	}
	while (*dest++ = *sour++)
	{
		;
	}
	return p;
}

运行结果:

可见我们的代码是符合要求的。

3. strcat函数的危险性

我们来看一种情况:

arr2追加arr1的所有数据后已经放满,arr2内部结尾就没有\0了,但是arr2结尾外面被追加了一个\0,运行时报错:

显示arr2周围栈被破坏

我们再看一下这种情况:

和上一种情况相似,arr2外面的内容也被修改了,同样成功打印了出来,所以arr2外面结尾有\0,系统同样报错了。

因此我们要避免这种请路况,这也是strcat函数的危险之处,我们无法保证destination能够将source全部接收,且没有报错,相比之下我们最好使用strncat函数。

4. strncat函数详解

相比于strcat它多了一个参数num

num是传入要追加的字符串长度。在我们写代码的时候就要考虑好想要追加几个字符。

演示:

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

int main()
{
	char arr1[] = { "abcdef" };
	char arr2[10] = { "xxxx" };
	strncat(arr2, arr1,3);
	printf("%s\n", arr2);
	return 0;
}

结果:

4.1 strncat函数的特殊情况验证

下面我们来进行一些特殊情况的验证;

可见在追加结尾会加一个\0.

再看一种情况:

可见如果num大于arr1的大小,也不会报错,追加完已有的字符串后就停止了追加,相当于没加猜数的strcat函数。

strncat安全在于使用前我们要考虑好数组的大小,防止了意外报错。

感谢观看,欢迎在评论区讨论

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

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

相关文章

LVS 负载均衡-DR模式

一 . DR 模式 直接路由 &#xff1a; 1.介绍&#xff1a; 直接路由&#xff08;Direct Routing&#xff09;&#xff1a;简称 DR 模式&#xff0c;采用半开放式的网络结构&#xff0c;与 TUN 模式的结构类似&#xff0c;但各节点并不是分散在各地&#xff0c;而是与调度器位…

基于SpringBoot+MYSQL的旅游网站

目录 1、前言介绍 2、主要技术 3、系统流程分析 1、登录流程图如下&#xff1a; 2、管理员后台管理流程图如下&#xff1a; 3. 修改密码流程图如下&#xff1a; 4、系统设计 4.1、系统结构设计 4.2 数据库概述 4.2.1 数据库概念设计 4.2.2 数据库逻辑设计 5、运行截…

alibabacloud学习笔记08(小滴课堂)

讲解JDK⼀些基础知识科普 介绍什么是微服务的网关和应用场景 介绍网关SpringCloud Gateway 创建SpringCloud网关项目和依赖添加 1.添加依赖&#xff1a; 2.创建启动类&#xff1a; 3.配置配置文件&#xff1a; 启动验证&#xff1a; 启动网关以及对应的订单服务&#xff1a; …

一个简单的微信小程序表单提交样式模板

没什么东西&#xff0c;只是方便自己直接复制使用 .wxml <view class"box"><form bindsubmit"formSubmit"><view class"form-item"><text class"head">姓名&#xff1a;</text><input class"…

luatos框架中LVGL如何使用中文字体〈二〉编写脚本设置中文字体

本节内容&#xff0c;将和大家一同学习&#xff0c;在luatos环境中&#xff0c;使用lvgl库&#xff0c;一步步的编译固件、编写脚本&#xff0c;最终实现中文字体的显示。 芯片&#xff1a;AIR101 LCD屏&#xff1a;ST7789 上一节&#xff0c;我们一同学习了&#xff0c;硬件引…

GDPU 竞赛技能实践 天码行空3

1. 五星填数 &#x1f496; 源代码 public class Main {static int[] nums new int[11];static boolean[] used new boolean[13];static long ans 0;static{used[7] true;used[11] true;}public static void main(String[] args){dfs(1);System.out.println(ans / 10);//…

缓存的使用

文章目录 1.为什么要有缓存&#xff1f;2.缓存使用场景3.缓存分类4.缓存使用模式5.淘汰策略6.缓存的崩溃与修复7.缓存最佳实践参考文献 1.为什么要有缓存&#xff1f; 数据访问具有局部性&#xff0c;符合二八定律&#xff1a;80% 的数据访问集中在 20% 的数据上&#xff0c;这…

React 的入门介绍

React 是什么 React是一个用于构建用户界面的JavaScript库。它由Facebook开发&#xff0c;并于2013年首次发布。React将用户界面拆分为小的可重用组件&#xff0c;每个组件都有自己的状态&#xff0c;并根据状态的变化来更新界面。 React使用了虚拟DOM&#xff08;Virtual DO…

人工智能迷惑行为大赏——需求与科技的较量

目录 前言 一、 机器行为学 二、人工智能迷惑行为的现象 三、产生迷惑行为的技术原因 四、社会影响分析 五、解决措施 总结 前言 随着ChatGPT热度的攀升&#xff0c;越来越多的公司也相继推出了自己的AI大模型&#xff0c;如文心一言、通义千问等。各大应用也开始内置…

Python 数据持久层ORM框架 SQLAlchemy模块

文章目录 ORM 框架SQLAlchemy 简介SQLAlchemy 作用SQLAlchemy 原理SQLAlchemy 使用流程数据库驱动配置关系型数据库配置NoSQL数据库配置 创建引擎(Engine)定义模型类(ORM)创建会话(Session)创建数据库表其他关键字参数&#xff0c;这些参数将传递给底层的 DDL 创建函数。 删除数…

cmake的一个简单通用模板

文件的tree结构如下所示 在build目录下执行cmake&#xff1a; cmake ../ //生成makefile make //编译 若想清理cmake产生的文件&#xff0c;直接删掉build rm -r build 顶层 CMakeLists.txt cmake_minimum_required(VERSION 3.5) // 限制版本号&#xff0c;因…

nginx实时流量拷贝ngx_http_mirror_module

参考&#xff1a; Module ngx_http_mirror_module Nginx流量拷贝ngx_http_mirror_module模块使用方法详解 ngx_http_mirror_module用于实时流量拷贝 请求一个接口&#xff0c;想实时拷贝这个请求转发到自己的服务上&#xff0c;可以使用ngx_http_mirror_module模块。 官网好像…

【Python】科研代码学习:十一 Optimization (Optimizer, Scheduler)

【Python】科研代码学习&#xff1a;十一 Optimization [Optimizer, Schedule] Optimizer 前置知识优化器在 torch 中的调用优化器在 transformers 中的调用AdamW 优化器 Scheduler 前置知识调度器在 transformers 中的调用 Optimizer 前置知识 什么是 Optimizer 优化器&#…

动态住宅代理IP使用教程全面讲解

在数字化时代&#xff0c;隐私保护和信息安全成为全球网民的共同关切。特别是对于海外用户&#xff0c;由于地理位置和网络监管政策的不同&#xff0c;访问全球信息资源变得更加复杂。使用动态住宅IP搭建代理&#xff0c;作为解决这一问题的有效手段&#xff0c;动态IP代理通过…

漏洞原理 | CORS跨域学习篇

0x01&#xff1a;原理 1、 什么是CORS 全称跨域资源共享&#xff0c;用来绕过SOP(同源策略)来实现跨域访问的一种技术。 CORS漏洞利用CORS技术窃取用户敏感信息 2、 同源策略简介 同源策略是浏览器最核心也是最基本的安全功能&#xff0c;不同源的客户端脚本在没有明确授权…

智慧城市与绿色出行:共同迈向低碳未来

随着城市化进程的加速&#xff0c;交通拥堵、空气污染、能源消耗等问题日益凸显&#xff0c;智慧城市与绿色出行成为了解决这些问题的关键途径。智慧城市利用信息技术手段&#xff0c;实现城市各领域的智能化管理和服务&#xff0c;而绿色出行则强调低碳、环保的出行方式&#…

2.2 评估方法 机器学习

我们若有一个包含m个样例的数据集&#xff0c;若我们既需要训练&#xff0c;也需要测试&#xff0c;我们该如何处理呢&#xff1f;下面是几种方法&#xff1a; 2.2.1 留出法 “留出法”直接将数据集D划分为两个互斥的集合&#xff0c;其中一个作为训练集S&#xff0c;另一个作…

OpenGL-贴纸方案

OpenGL-贴纸方案 普通贴纸&#xff08;缩放、Z轴旋转、平移&#xff09; OpenGL环境说明 OpenGL渲染区域使用正交投影换算,正常OpenGL坐标是vertexData,这样的 Matrix.orthoM 进行换算 //顶点坐标&#xff08;原点为显示区域中心店&#xff09;private final float[] vertex…

软件应用实例,宠物医院处方笺模板实例,佳易王兽医电子处方开单管理系统软件操作教程

软件应用实例&#xff0c;宠物医院处方笺模板实例&#xff0c;佳易王兽医电子处方开单管理系统软件操作教程 一、前言 以下软件程序操作教程以佳易王兽医电子处方软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、兽医宠物店开电子处…

React进阶(Redux,RTK,dispatch,devtools)

1、初识Redux 是React最常用的集中状态管理工具&#xff0c;类似于Vue中的Pinia(Vuex)&#xff0c;可以独立于框架运行 作用&#xff1a;通过集中管理的方式管理应用的状态 案例-实现一个计数器 实现步骤&#xff1a; Redux管理数据的流程&#xff1a; state:一个对象&…