strcpy和sprintf和memcpy的区别.md

VS2015 C++栈内存越界错误诊断与修复实战指南 栈内存越界访问是C++编程中常见的内存安全问题,其原理在于程序访问了分配给变量的栈帧边界之外的内存区域,破坏了栈的完整性。这种错误可能导致程序崩溃、数据损坏或安全漏洞,在涉及指针运算、数组操作和缓冲区处理时尤为突出。从技术价值看,理解栈内存布局和运行时检查机制能帮助开发者编写更健壮的代码,避免未定义行为。在应用场景上,无论是开发桌面应用、游戏引擎还是系统软件,正确处理栈内存都至关重要。本文聚焦于Visual Studio 2015环境下的“Stack around the variable was corr 阅读详情

strcpy、sprintf和memcpy的区别

下面代码说明:

#include <iostream>
using namespace std;
#include <string.h>
void strcpyMethod()
{
	/*
	char *strcpy(char *dest, const char *src) :C 库函数 把 src 所指向的字符串复制到 dest
	*/
	char str1[15] = "AAAAAAAAA";
	char str2[8] = "abcdefg";	//由于字符串,还要加个'\0'的结束符,所以是8
	char str3[] = "12345678890";
	cout << "str2:" << str2 << endl;
	strcpy(str1, str2);	//将str2 拷贝给str1
	//strcpy(str1, str3);	//error: 越界:str3长度大于str1数组大小
	cout << "str1:" << str1 << endl;

	//注意:字符串都以'\0'结束
	cout << str2[0] << endl;
	cout << str2[1] << endl;
	cout << str2[2] << endl;
	cout << str2[3] << endl;
	cout << str2[4] << endl;
	cout << str2[5] << endl;
	cout << str2[6] << endl;
	cout << str2[7];
	cout << "体现出结束标志符" << endl;

	cout << str1[0] << endl;
	cout << str1[1] << endl;
	cout << str1[2] << endl;
	cout << str1[3] << endl;
	cout << str1[4] << endl;
	cout << str1[5] << endl;
	cout << str1[6] << endl;
	//cout << str1[7];
	cout << "Test" << endl;

	//strcpy(str1, "hello world");	//error: 越界:hello world长度大于str1数组大小
	strcpy(str1, "hello");
	cout << str1 << endl;

	/*
	输出:
		str2:abcdefg
		str1:abcdefg
		a
		b
		c
		d
		e
		f
		g
		 体现出结束标志符
		a
		b
		c
		d
		e
		f
		g
		Test
		hello
	*/
}

void sprintfMethod()
{
	/*
	int sprintf(char *str, const char *format, ...) : 发送格式化输出到 str 所指向的字符串
	*/

	char str_spr[100];
	sprintf(str_spr, "I am a %s hi %d C++ %c", "student", 123, 'a');	//格式化字符串,%s :字符串 %d:整数 %c:字符
	cout << str_spr << endl;
	cout << "-----------------------------" << endl;
	char str_temp[] = "h%c 1%d1 %s C++!";
	char buf[100];
	sprintf(buf, str_temp, 'i', 2, "hello");	//str_temp 为待格式化的字符串,str_temp格式化输出到buf
	cout << "buf:	" << buf << "\tlen:	" << "	" << strlen(buf) << endl;

	/*
	输出:
		I am a student hi 123 C++ a
		-----------------------------
		buf:    hi 121 hello C++!       len:            17
	*/
}

void memcpyMethod()
{
	/*
	void *memcpy(void *str1, const void *str2, size_t n) :C 库函数 从存储区 str2 复制 n 个字符到存储区 str1
	*/

	char str1[] = "abcdefg";
	char str2[10];
	char str3[10];
	memcpy(str2, str1, strlen(str1)+1);	//由于由于strlen只是获得str1的实际长度,并没包含'\0',所以加1将'\0'包含进去
	memcpy(str3, str1, 2);
	str3[2] = '\0';	//由于没有'\0',所以要手动添加结束标志符
	cout << str2 << endl;
	cout << str3 << endl;
	/*
	输出:
		abcdefg
		ab
	*/

	//覆盖原数据
	char dest [] = "123456";
	const char *src = "*****";
	memcpy(dest, src, strlen(src));
	//注意:从src中复制到dest的字符串的长度不能超过dest的实际长度,否则会因为越界报错
	//若要不报错,则要事先设计 dest的大小 大于 strlen(src)
	cout << dest << endl;
	
	//输出: *****6

	const char *p = "ABCDEFGH";
	char pstr[20];
	memcpy(pstr, p + 2, 5);	//从p的第二个位置开始连续复制5个到pstr中
	pstr[5] = '\0';
	cout << "p: "<<p << endl;
	cout << "pstr:"<<pstr << endl;
	
	/*
	输出:
	p: ABCDEFGH
	pstr:CDEFG
	*/
}

int main()
{
	strcpyMethod();
	sprintfMethod();
	memcpyMethod();
	return 0;
}
/*
strcpy、sprintf和memcpy三者的区别:
(1)操作对象不同,strcpy的两个操作对象均为字符串类型;
	sprintf的源操作对象可以是多种类型,目的操作对象是字符串;
	memcpy的两个操作对象是两个可任意操作的内存地址,不限于任何数据类型
(2)执行效率不同,memcpy最高,strcpy次之,sprintf最低
(3)实现功能不同,strcpy实现两个字符串变量之间的拷贝,
	sprintf实现其他数据类型格式化到字符串之间的转化,
	memcpy 主要是内存块之间的拷贝
*/
//三者都有拷贝的功能,针对对象不同,应结合实际情况选择使用
GCC编译原理与实战:从预处理到链接的完整流程解析 编译器是将高级语言转换为机器指令的核心工具,其本质是一套确定性、可验证的转译系统。GCC通过前端解析、中间表示(GIMPLE)、后端生成的三层架构,实现C/C++等语言到x86、ARM、RISC-V等架构的精准映射。这一过程涵盖预处理、编译、汇编、链接四大阶段,每步都影响调试能力、性能表现与安全边界。理解GCC不仅关乎命令行选项(如-O2、-g、--sysroot),更涉及GNU工具链协同(Binutils、GDB、Make)及交叉编译实践。掌握其原理,才能精准定位undefined reference、o 阅读详情

相关推荐

Mythos:首个具备语义级漏洞建模能力的AI安全模型

漏洞挖掘正从传统静态分析(SAST)和动态扫描(DAST)迈向基于程序语义理解的新阶段。其核心原理是将符号执行、约束求解与大语言模型深度耦合,实现对内存布局、竞态条件、权限绕过等底层缺陷的数学可证伪式推理。这种语义级漏洞建模能力,显著提升了零日漏洞发现的准确性与可复现性,大幅压缩从代码审计到POC生成的全链路周期。在金融、医疗、关键基础设施等高安全要求场景中,它已开始替代人工白帽团队执行自动化攻防验证,并驱动SBOM标准化、CI/CD内嵌审计、防御性AI等新一代安全实践落地。Mythos正是这一技术跃迁的标

weixin_30897079的博客 353

strcpy和strncpy sprintf和_snprintf的区别

Strcpy 和strncpy  sprintf 和_snprintf,snprintf的区别Strncpy 和 _snprintf ,snprintf是边界安全的函数1.  Strcpy 和strncpychar *strncpy(char *strDest,const char *strSource,size_t count );//count = strdest的长度 – 1

weberxian的专栏 2335

【16】linux命令/工具,systemd,文件操作,动静态库,信号,socket

apt install python3-pip --fix-missing(断开vpn,cp /etc/apt/sources.list /etc/apt/sources.list.bak,python3 -m pip install --upgrade pip,apt-get update,pip install 包名 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com)设置时间,联网,apt-get install vim。

持续更新ing... 6788

strcpy,sprintf的区别

strcpy,sprintf的区别 这些函数的区别在于实现功能以及操作对象不同。 strcpy 函数操作的对象是 字符串 ,完成从源字符串到目的字符串的拷贝功能。 snprintf 函数操作的对象 不限于字符串  :虽然目的对象是字符串,但是源对象可以是字符串、也可以是任意基本类型的数据。这个函数主要用来实现 (字符串或基本数据类型)向 字符串 的转换 功能。如果源对象是字符串,并且指定

xxaichishizi的博客 1809

C语言经典面试题之深入解析字符串拷贝的sprintf、strcpy和memcpy使用与区别

sprintf 指的是字符串格式化命令,是把格式化的数据写入某个字符串中,即发送格式化输出到 string 所指向的字符串,直到出现字符串结束符 '\0' 为止。

╰つ栺尖篴夢ゞ 7174

SAP-QM-质检操作

SAP-QM-质检操作

yanzibing99的博客 8178

理解strcpy()、sprintf()、strncpy()函数在复制字符串的过程中空字符‘\0‘和换行符‘\n‘的使用

通过使用strcpy()、sprintf()、strncpy()替换字符串继续理解空字符'\0'和换行符'\n'

zjrwinner的博客 3073

别再只用真彩色了!手把手教你用ENVI主成分分析(PCA)给遥感图像‘美颜’与‘瘦身’

本文详细介绍了如何利用ENVI主成分分析(PCA)技术优化遥感图像处理,实现数据‘美颜’与‘瘦身’。通过PCA的维度压缩、噪声分离和特征增强三大优势,显著提升高光谱数据的可视化效果和分析效率。文章还提供了ENVI操作的最佳实践和常见问题解决方案,帮助读者掌握这一遥感图像处理的游戏规则改变者。

weixin_28465009的博客 276

strcpy() ,sprintf()和 memcpy()

目标缓冲区需要足够大,否则可能导致。

zjkyeah的博客 543

从选型到阵列:基于ESP32-S3的智能硬件麦克风系统设计实战

本文详细介绍了基于ESP32-S3芯片设计智能硬件麦克风阵列的完整实战方案。从核心芯片选型、数字MEMS麦克风的参数解读与电路设计,到关键的声学结构密封、阵列布局策略,再到利用ESP-ADF框架构建音频处理流水线并集成回声消除、噪声抑制等算法,提供了从硬件到软件的全链路设计指南与避坑要点,旨在实现清晰、稳定的远场语音交互。

weixin_29173777的博客 266

huggingface 镜像站推荐

在做 Ai 应用开发或者学习的时候,我们经常需要下载各种模型,而 huggingface 的模型下载速度很慢或者根本就连不上,这里推荐一个 huggingface 的镜像站,速度很快,可以大大提高我们的效率。

t951984189的博客 1万+

C++-简述strcpy、sprintf 和 memcpy 的区别

需要注意的是,参数 num 表示要复制的字节数,要保证目标地址有足够的空间容纳源内存块。该函数的第一个参数是目标字符串缓冲区,第二个参数是输出格式字符串,后面的参数表示要输出的具体数据,可以有多个。需要注意的是,输出的字符串长度不能超过缓冲区大小。需要注意的是,该函数会复制整个字符串,包括 NULL 终止符,因此要保证目标地址有足够的空间容纳源字符串。从上面可以知道,strcpy,sprintf 和 memcpy 都是用于字符串或内存块的复制操作的函数,但是也有很多区别。,来选择合适的函数实现拷贝功能。

MoOtA 1427

卷积神经网络-猫狗识别(附源码)

利用python实现一个卷积神经网络,训练猫狗数据集,实现对猫狗图片的预测识别

m0_63223213的博客 2万+

BinAbsInspector实战:基于抽象解释的二进制漏洞自动化静态分析

静态分析是软件安全领域的基础技术,它通过在不运行程序的情况下检查源代码或二进制代码来发现潜在缺陷。其核心原理是对程序语义进行形式化建模与推理,旨在以自动化方式实现高代码覆盖率的安全审计。在技术价值上,静态分析能够早期发现漏洞,降低修复成本,并适用于大规模代码的自动化安全检查。相较于传统的模式匹配或人工逆向,基于抽象解释的静态分析技术通过模拟程序执行路径并跟踪变量状态,能更精准地理解程序语义,从而有效发现缓冲区溢出、整数溢出等内存安全漏洞。这一技术尤其适用于对大型、复杂的二进制程序进行自动化漏洞挖掘,例如在固

weixin_33796177的博客 381

电网加密芯片全解析:分类与功能​

在电网数字化转型的浪潮中,数据安全和设备的身份认证变得愈发重要。加密芯片作为保障电网信息安全的核心部件,凭借独特的技术特性,在不同应用场景下发挥着关键作用,有力推动着智能电网的安全稳定发展。接下来,我们将对电网中常见的加密芯片展开分类介绍,并探讨其对应的功能。​。

1962

深度学习笔记(1)机器学习与深度学习基础

一些深度学习的简单概念和Transformer的学习。

hanliu2003的博客 1492

Rivet Actors 仓库文档同步规范:docs-sync 对照表与代码块类型检查实战指南

在 Rivet Actors 这类"引擎 + 多语言 SDK + 前端控制台"耦合紧密的开源仓库中,改动一行引擎配置或一个 ActorError 错误码,往往意味着文档、示例与测试必须同步更新。本文以仓库内的 [.claude/reference/docs-sync.md](https://link.gitcode.com/i/ffcd33cd673d650b142ba6334b1a8b7b) 为

gitblog_01095的博客 373

【2023版】基于JT808/JT1078协议的车载视频监控平台开发实战-开源架构解析

本文详细解析了基于JT808/JT1078协议的车载视频监控平台开发实战,涵盖协议核心作用、开源架构设计、开发避坑指南及二次开发建议。重点介绍了JT1078协议在音视频传输中的优化方案,以及海量位置数据存储、高可用架构等关键技术点,为开发者提供全面的实战参考。

weixin_26965807的博客 236

写给三弟的 C语言编程 快速入门

三弟,你要的C语言快速入门,已整理好 请接收。

码刀攻城 3932

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

编译与调试完全指南—第2章 GCC编译选项详解

本文详细介绍了GCC编译器的各类编译选项及其应用场景。主要内容包括: 基础编译选项:宏定义(-D)、输出控制(-o、-v)和编译阶段控制(-E、-S、-c) 文件查找选项: 头文件查找(-I、-isystem、-idirafter)及其搜索顺序 库文件查找(-L、-Wl,-rpath-link、-Wl,-rpath)的区别与用法 特殊变量$$ORIGIN的使用 交叉编译路径配置(--sysroot、-B) 实际应用建议: 字符串宏定义时需注意引号转义 区分-I和-isystem的使用场景 灵活使用Makef

weixin_43149888的博客 153

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Mythos Preview:面向真实系统安全的AI红队能力跃迁

AI安全工具正从静态规则匹配迈向系统级认知建模,其核心在于对程序语义、内存布局与权限流的深度理解。基于第一性原理推理的通用模型,能跨越架构差异(如FreeBSD 8.4或ARM64固件),在超长上下文下构建动态语义图,实现漏洞发现、利用生成与报告输出的端到端闭环。这种能力已突破传统SAST/Fuzzing局限,支撑CI/CD嵌入式自动化审计与生产就绪型PoC交付,成为关键基础设施防御体系中的可信红队引擎。Mythos Preview正是这一范式演进的标志性实践。

weixin_33862993的博客 464

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

linux下的strcmp()、strcpy()、strlen()、strcat()、strncat()函数

linux下的strcmp()、strcpy()、strlen()、strcat()、strncat()函数

qwerwqwe的博客 1575

strcpy,sprintf,memcpy的区别

区别

-笔记- 2383

C语言三大函数对比:strcpy VS sprintf VS memcpy

本文详细比较了C语言中strcpy、sprintf和memcpy三个常用函数的功能与特性。strcpy用于字符串复制但存在缓冲区溢出风险;sprintf可格式化输出到字符串,同样存在安全隐患;memcpy则适用于任意内存块的快速拷贝。三者均不检查目标缓冲区大小,建议使用更安全的替代版本(如strncpy、snprintf)。文章通过对比表阐明差异,强调安全使用的重要性,并给出代码示例和最佳实践建议:优先选用带长度控制的函数版本,以防止缓冲区溢出漏洞。

弘羽 1102

简述strcpy、sprintf与memcpy的区别?

如图,strcpy的复制大小由函数('\0'停止)决定,并且只能是字符串类型,memcpy的复制由程序员输入的sizeof大小决定(不超过创建的数组大小或者所malloc的内存大小),对数据类型没有要求;b.memcpy将源内存中的数据按字节复制到目标内存中,可以复制任意类型的数据,不限于字符串。b.strcpy会复制源字符串直到遇到空字符‘\0’,并将其复制到目标字符串中,包括空字符。b.sprintf将格式化的数据根据指定的格式写入到目标字符串中。a.sprintf用于将格式化的数据写入字符串中。

dhongyi的博客 528

sprintf 和strcpy 的差别

sprintf据说是printf的孪生兄弟,在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。sprintf 跟printf 在用法差不多,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。sprintf 是个变参函数,定义如下:int sprintf( char *buffer, const char *format [, argument] ....

weixin_30652897的博客 948
上一篇: sizeof与strlen.md
下一篇: 数组指针和指针数组及引用的简单理解.md
七月之雨
博客等级 码龄9年 7粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值