C/C++ 基础函数

memcpy:C/C++语言中的一个用于内存复制的函数,声明在 string.h 中(C++是 cstring)

void *memcpy(void *destin, void *source, unsigned n);

作用是:以source指向的地址为起点,将连续的n个字节数据,复制到以destin指向的地址为起点的内存中。它可以用于复制任意类型的数据,包括基本类型(如整数、浮点数)和自定义结构体等
函数有三个参数,第一个是目标地址,第二个是源地址,第三个是数据长度。

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

int main() {
    int source[] = {1, 2, 3, 4, 5};
    int destination[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
    
    memcpy(destination, source, sizeof(source));
    
    for (int i = 0; i < 10; i++) {
        printf("%d ", destination[i]);
    }
    
    return 0;
}

//输出结果为  1 2 3 4 5 60 70 80 90 100

使用memcpy函数时,需要注意:数据长度(第三个参数)的单位是字节memcpy 函数不会自动添加字符串的结尾符号 ‘\0’,因此需要手动加上 ‘\0’

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

int main() {
    char source[] = "Hello, World!";
    char destination[20];
    
    memcpy(destination, source, strlen(source) + 1);
    
    printf("Source: %s\n", source);
    printf("Destination: %s\n", destination);

    return 0;
}

strlen( (source) +1 )的目的是把sourc中的结束标志'\0'也拷贝过去


strcpy

char* strcpy(char* destination, const char* source);

函数通过逐个字符复制的方式,将 源字符串中的内容 拷贝到 目标字符串中,直到遇到源字符串的结尾字符(\0)或者达到目标字符串的大小限制。且结束后在目标字符数组自动加'\0'

strcpy 函数不仅可以用于复制字符串,还可以复制任何类型的内存块,包括字符数组、结构体等

两个参数:目标字符串 destination 和源字符串 source

需要注意的是,在使用 strcpy 函数时,务必确保目标字符串的缓冲区足够大,以防止缓冲区溢出的错误。此外,源字符串需要以空字符 \0 结尾,以使复制后的字符串正确结束

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

int main() {
    char source[] = "Hello, World!";
    char destination[20];
    
    strcpy(destination, source);
    
    printf("Source: %s\n", source);
    printf("Destination: %s\n", destination);

    return 0;
}
//输出结果为
//Source: Hello, World!
//Destination: Hello, World!

strncpy: 用于将一个字符串的指定数量的字符复制到另一个字符串中

char* strncpy(char* destination, const char* source, size_t num);

strncpy 函数会从源字符串 中复制指定数量的字符(最多 num 个)到目标字符串中。

        如果源字符串的字符数量小于 num,则会使用空字符 \0 来填充目标字符串的剩余空间,以确保目标字符串具有 num 个字符。

        如果源字符串的字符数量大于等于 num,则目标字符串将只包含源字符串中的 num 个字符,不会自动添加空字符 \0,需要手动添加

        目标字符串 的缓冲区必须足够大,以容纳复制的字符。如果目标字符串的长度小于 num,则需要手动在复制后的字符串中添加空字符 \0。

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;

int main() {
    char source[] = "Hello, this is a test string";
    char destination[20];
    memset(destination, 0, sizeof(destination));

    strncpy(destination, source + 7, 4); // 从源字符串的第8个字符开始复制4个字符到目标字符串中
    destination[4] = '\0'; // 手动添加字符串结尾标志

    printf("%s\n", destination);
    return 0;
}
// 输出结果为:  this

sprintf() 是一个库函数,用于将格式化的数据写入字符数组中

原型:int sprintf(char *str, const char *format, ...);

其中,参数 str 表示要存储格式化结果的字符串缓冲区,参数 format 表示格式化字符串的格式,类似于 printf() 函数中的格式化字符串,可以包含格式化标记和转换说明符,以及其他字符。在格式化字符串中,可以用类似于 %d%f%s 等占位符来表示后面可变参数中不同类型的值,并将它们格式化为字符串。

sprintf() 函数的作用就是将格式化后的结果写入到字符数组 str 中,并返回写入的字符数(不包括终止符 \0)。如果发生错误,则返回负值。

        执行完这段代码后,字符串缓冲区 acGpsTime 中存储了经过格式化后的字符串,格式为 “%4d-%02d-%02d %02d:%02d:%02d”,其中 %4d 表示年份,%02d 表示月、日、时、分、秒,经过格式化后的结果如 “2021-11-11 11:11:11” 这样的字符串。需要注意的是,sprintf() 函数存在缓冲区溢出和安全性问题,因此使用时要格外小心,避免发生安全隐患


     snprintf 是一个 C 语言标准库函数,用于格式化字符串并将结果写入到指定的字符数组中原型:int snprintf(char *str, size_t size, const char *format, ...);

    snprintf 的第一个参数 str 是指向字符数组的指针,用于存储格式化后的字符串。第二个参数 size 是字符数组的大小,用于限制输出的字符数,以防止缓冲区溢出。

    format 参数是格式化字符串,它可以包含普通字符和格式化说明符。可以使用 % 符号和一些转换字符来指定输出的格式。

        除了 format 参数外,snprintf 还可以接受其他可变参数,用于填充格式化字符串中的占位符。

        函数的返回值表示成功写入字符数组的字符数(不包括终止符 \0),或者当遇到错误时返回负数。

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

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

相关文章

全国(山东、安徽)职业技能大赛--信息安全管理与评估大赛题目+答案讲解

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

Python算法例25 落单的数Ⅲ

1. 问题描述 给出2n2个非负整数元素的数组&#xff0c;除其中两个数字之外&#xff0c;其他每个数字均出现两次&#xff0c;找到这两个数字。 2. 问题示例 给出[1&#xff0c;2&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;4&#xff0c;5&#xff0c;3]&#xff0c…

dubbo线程池为什么耗尽

文章概述 大家可能都遇到过DUBBO线程池打满这个问题&#xff0c;报错如下&#xff0c;本文我们就一起分析DUBBO线程池打满这个问题。 cause: org.apache.dubbo.remoting.RemotingException: Server side(10.0.0.100,20881) thread pool is exhausted, detail msg:Thread pool …

Python中json模块的使用与pyecharts绘图的基本介绍

文章目录 json模块json与Python数据的相互转化 pyecharts模块pyecharts基本操作基础折线图配置选项全局配置选项 json模块的数据处理折线图示例示例代码 json模块 json实际上是一种数据存储格式&#xff0c;是一种轻量级的数据交互格式&#xff0c;可以把他理解成一个特定格式…

模型微调入门介绍一

备注&#xff1a;模型微调系列的博客部分内容来源于极客时间大模型微调训练营素材&#xff0c;撰写模型微调一系列博客&#xff0c;主要是期望把训练营的内容内化成自己的知识&#xff0c;我自己写的这一系列博客除了采纳部分训练营的内容外&#xff0c;还会扩展细化某些具体细…

【贪心】单源最短路径Python实现

文章目录 [toc]问题描述Dijkstra算法Dijkstra算法应用示例时间复杂性Python实现 个人主页&#xff1a;丷从心 系列专栏&#xff1a;贪心算法 问题描述 给定一个带权有向图 G ( V , E ) G (V , E) G(V,E)&#xff0c;其中每条边的权是非负实数&#xff0c;给定 V V V中的一个…

Packet Tracer -使用 Ping 和 Traceroute测试 网络的连通性

地址分配表 目标 第 1 部分&#xff1a;测试和恢复 IPv4 连通性 第 2 部分&#xff1a;测试和恢复 IPv6 连通性 场景 本练习中存在连通性方面的问题。除了 收集和记录有关网络的信息&#xff0c;您还需要找出 问题&#xff0c;并实施可行的解决方案来恢复网络的连通性。 注意…

c语言:求1/2+2/3+3/4+……n-1/n的和|练习题

一、题目 求1/22/33/4……n-1/n的和 如图&#xff1a; 二、思路分析 1、1/2、2/3、3/4……可以用(i/i1) 2、设置一个函数&#xff0c;求数的相加之和 三、代码截图【带注释】 四、源代码【带注释】 #include <stdio.h> int main() { int num; printf("输入…

【RabbitMQ】RabbitMQ详解(二)

RabbitMQ详解 死信队列死信来源消息TTL过期队列达到最大长度消息被拒绝 RabbitMQ延迟队列TTL的两种设置队列设置TTL消息设置TTL 整合SrpingBoot队列TTL延时队列TTL优化Rabbtimq插件实现延迟队列 死信队列 先从概念解释上搞清楚这个定义&#xff0c;死信&#xff0c;顾名思义就…

S7项目EMS输送线操作

C型钩装置是支撑轨道的挂件,通过和轨道配合可以组成寓任意输送网络。并且可以拆卸和调整。 轨道是承载重物并供载物车行走的部件,它是通过连接装置(支撑件)悬于辅梁或房架上。它分直轨和弯轨两种形式,与道岔配合,能组合成生产工艺所需的任意输送网络。 道岔是载物车沿 轨…

域内定位个人PC的三种方式(1)

会话搜集 在cmd下调用query session命令可以获得当前环境下的windows会话 NetSessionEnum 这个函数不允许直接查询是谁登陆&#xff0c;但是它允许查询是谁在访问此工作站的网络资源时所创建的网络会话&#xff0c;从而知道来自何处&#xff0c;此函数不需要高权限即可查询 第…

UE和Android互相调用

ue和android互调 这两种方式都是在UE打包的Android工程之上进行的。 一、首先是UE打包Android&#xff0c;勾选下面这项 如果有多个场景需要添加场景 工程文件在这个路径下 然后可以通过Android Studio打开&#xff0c;选择gradle打开 先运行一下&#xff0c;看看是否可以发布…

简述用C++实现SIP协议栈

SIP&#xff08;Session Initiation Protocol&#xff0c;会话初始协议&#xff09;是一个基于文本的应用层协议&#xff0c;用于创建、修改和终止多媒体会话&#xff08;如语音、视频、聊天、游戏等&#xff09;中的通信。SIP协议栈是实现SIP协议的一组软件模块&#xff0c;它…

【数据库系统概论】第3章-关系数据库标准语言SQL(1)

文章目录 3.1 SQL概述3.2 学生-课程数据库3.3 数据定义3.3.1 数据库定义3.3.2 模式的定义3.3.3 基本表的定义3.3.4 索引的建立与删除3.3.5 数据字典 3.1 SQL概述 动词 分类 三级模式 3.2 学生-课程数据库 3.3 数据定义 3.3.1 数据库定义 创建数据库 tips&#xff1a;[ ]表…

【数据结构入门精讲 | 第十七篇】一文讲清图及各类图算法

在上一篇中我们进行了的并查集相关练习&#xff0c;在这一篇中我们将学习图的知识点。 目录 概念深度优先DFS伪代码 广度优先BFS伪代码 最短路径算法&#xff08;Dijkstra&#xff09;伪代码 Floyd算法拓扑排序逆拓扑排序 概念 下面介绍几种在对图操作时常用的算法。 深度优先D…

uniapp自定义头部导航怎么实现?

一、在pages.json文件里边写上自定义属性 "navigationStyle": "custom" 二、在对应的index页面写上以下&#xff1a; <view :style"{ height: headheight px, backgroundColor: #24B7FF, zIndex: 99, position: fixed, top: 0px, width: 100% …

一起玩儿物联网人工智能小车(ESP32)——14. 用ESP32的GPIO控制智能小车运动起来(二)

摘要&#xff1a;本文主要讲解如何使用Mixly实现对单一车轮的运动控制。 下面就该用程序控制我们的小车轮子转起来了。打开Mixly软件&#xff0c;然后单击顶部“文件”菜单中的“新建”功能&#xff0c;我们来开启一个新程序的开发工作。 我们的工作同样是先从最简单的开始&am…

设计模式分类

不同设计模式的复杂程度、 细节层次以及在整个系统中的应用范围等方面各不相同。 我喜欢将其类比于道路的建造&#xff1a; 如果你希望让十字路口更加安全&#xff0c; 那么可以安装一些交通信号灯&#xff0c; 或者修建包含行人地下通道在内的多层互通式立交桥。 最基础的、 底…

视频编码码率控制

什么是码率控制 码率控制是编码器的一个重要模块&#xff0c;主要的作用就是用算法来控制编码器输出码流的大小。虽然它是编码器的一个非常重要的部分&#xff0c;但是它并不是编码标准的一部分&#xff0c;也就是说&#xff0c;标准并没有给码控设定规则。我们平时用的编码器…

50 个具有挑战性的概率问题 [04/50]:尝试直至首次成功

一、说明 你好&#xff0c;我最近对与概率相关的问题产生了兴趣。我偶然发现了 Frederick Mosteller 所著的《五十个具有挑战性的概率问题及其解决方案》这本书。我认为创建一个系列来讨论这些可能作为面试问题出现的迷人问题会很有趣。每篇文章仅包含 1 个问题&#xff0c;使其…