strcpy ,strncpy ,strlcpy,strcpy_s(转载)

无线图像传输新突破:深度JSCC算法在低带宽环境下的性能实测 本文深入探讨了基于深度学习的信源信道联合编码(JSCC)算法在低带宽无线图像传输中的突破性表现。通过实测数据对比,深度JSCC在低信噪比环境下展现出卓越的鲁棒性,有效对抗传统方案的“悬崖效应”,实现图像质量的平滑下降,为远程医疗、工业巡检等严苛场景提供了新的解决方案。 阅读详情

好多人已经知道利用strncpy替代strcpy来防止缓冲区越界。
但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式。


1. strcpy

我们知道,strcpy 是依据/0作为结束判断的,如果 to 的空间不够,则会引起 buffer overflow。strcpy 常规的实现代码如下(来自 OpenBSD 3.9):

char *
strcpy(char *to, const char *from)
{
       char *save = to;

       for (; (*to = *from) != ''; ++from, ++to);
       return(save);
}

但通常,我们的 from 都来源于用户的输入,很可能是非常大的一个字符串,因此 strcpy 不够安全。


2. strncpy

在 ANSI C 中,strcpy 的安全版本是 strncpy。

char *strncpy(char *s1, const char *s2, size_t n);

但 strncpy 其行为是很诡异的(不符合我们的通常习惯)。标准规定 n 并不是 sizeof(s1),而是要复制的 char 的个数。一个最常见的问题,就是 strncpy 并不帮你保证 结束。

char buf[8];
strncpy( buf, "abcdefgh", 8 );

看这个程序,buf 将会被 "abcdefgh" 填满,但却没有 结束符了。

另外,如果 s2 的内容比较少,而 n 又比较大的话,strncpy 将会把之间的空间都用 填充。这又出现了一个效率上的问题,如下:

char buf[80];
strncpy( buf, "abcdefgh", 79 );

上面的 strncpy 会填写 79 个 char,而不仅仅是 "abcdefgh" 本身。


strncpy 的标准用法为:(手工写上 )

strncpy(path, src, sizeof(path) - 1);
path[sizeof(path) - 1] = '';
len = strlen(path);


3. strlcpy

// Copy src to string dst of size siz. At most siz-1 characters
// will be copied. Always NUL terminates (unless siz == 0).
// Returns strlen(src); if retval >= siz, truncation occurred.
size_t
strlcpy(char *dst, const char *src, size_t siz);

而使用 strlcpy,就不需要我们去手动负责/0了,仅需要把 sizeof(dst) 告之 strlcpy 即可:

strlcpy(path, src, sizeof(path));
len = strlen(path);

if ( len >= sizeof(path) )
       printf("src is truncated.");

并且 strlcpy 传回的是 strlen(str),因此我们也很方便的可以判断数据是否被截断。

 

[* 一点点历史 *]

strlcpy 并不属于 ANSI C,至今也还不是标准。

strlcpy 来源于 OpenBSD 2.4,之后很多 unix-like 系统的 libc 中都加入了 strlcpy 函数,在 FreeBSD、Linux 里面都找到了 strlcpy。(Linux使用的是 glibc,glibc里面有 strlcpy,则所有的 Linux 版本也都应该有 strlcpy)

但 Windows 下是没有 strlcpy 的,对应的是strcpy_s函数

 

Win10蓝屏代码critical process died的解决方法 critical process died”蓝屏错误是Win10操作系统中较为常见的问题之一。当遇到这一问题时,可以尝试通过修复当前系统、检查硬盘槽位或重新安装系统等方法来解决。本文详细介绍了这三种方法的操作步骤和注意事项,希望能帮助大家摆脱这一困扰。同时,也建议大家在日常使用中注意系统的维护和更新,以减少类似问题的发生。 阅读详情

相关推荐

Wireshark 4.6 TCP 流图解析:3种拥塞控制算法可视化对比

本文深入解析Wireshark 4.6的TCP流图功能,通过可视化对比Reno、Cubic和BBR三种主流拥塞控制算法的性能特征。文章提供详细的实验环境搭建方法、流图分析工具使用技巧,以及算法调优建议,帮助网络工程师优化TCP性能。

weixin_29291573的博客 446

C语言-字符串拷贝(1)strcpy

C语言-字符串拷贝(1)strcpy1. strcpy1 定义:2 原型:3 功能:4 说明:5 缺点:6 实现2. 参考: 1. strcpy 1 定义: strcpy把含有’\0’结束符的字符串复制到另一个地址空间,返回值的类型为char* ,strcpy 是依据 /0 作为结束判断的。 2 原型: char strcpy(char dest, const char *src); 3 功能: ...

哈尼的博客 3049

GenomeSurvyIndex设计--随笔017

摘要: GenomeSurvyIndex是一款自动化多倍体基因组调查工具,整合FastK、Smudgeplot和GenomeScope2.0三大核心组件。该工具通过k-mer频谱特征自动识别基因组倍性类型,包括二倍体(1:2:4)和同源四倍体(1:2:3:4),并采用3a1b>2a2b算法判定同源/异源多倍体。工具提供完整的conda环境配置方案,封装为Python脚本实现全流程自动化分析,包含k-mer计数、倍性判定、基因组特征计算等功能,最终输出标准化报告和可视化图表。该方案可直接部署使用,适用于

weixin_44874487的博客 474

strcpy, strncpy, strlcpy的区别

然而,如果n大于或等于src的长度,strncpy会将src的所有字符复制到dest,但不会在dest的末尾添加’\0’结束符。这可能会导致问题,因为如果后续的代码试图访问dest作为一个以’\0’结束的字符串,可能会导致读取未初始化的内存或超出dest的边界。当src的长度小于n时,strncpy会将src的所有字符复制到dest,然后在dest的剩余部分用空字节(‘\0’)填充,直到复制了n个字符。函数会将源字符串(src)中的字符复制到目标字符串(dest)中,直到遇到源字符串的结束符’\0’。

我的博客 3505

SAP-PP 返工订单成本归集优化:从物料结算到成本中心的配置与增强实践

本文深入探讨SAP-PP模块中返工订单成本归集的优化方案,重点解析从物料结算到成本中心的配置与增强实践。通过结算参数文件配置、分配结构调整及增强开发实战,解决返工费用误计入物料成本的问题,确保财务核算精准性。文章还提供测试验证方案与常见报错处理技巧,助力企业实现成本数据清晰流向分析。

weixin_29260291的博客 365

TwinCAT3新手必看:5分钟搞定EtherCAT从站PDO动态配置(附电流变量添加技巧)

本文为TwinCAT3新手提供了EtherCAT从站PDO动态配置的快速入门指南。文章详细解析了Process Data Object(PDO)在实时数据交换中的核心作用,并分步演示了在TwinCAT3工程中扫描从站、动态添加与映射PDO(包括接收PDO和发送PDO)的完整操作流程。重点分享了如何灵活添加并监控如电机实际电流等关键工艺变量的高级技巧,并针对不同品牌驱动器的兼容性问题提供了实用的调试心法和解决方案,帮助工程师快速上手并优化工业自动化系统。

xgboost6farmer的博客 452

关于strlcpy函数的理解

1、转载https://blog.youkuaiyun.com/tigerjibo/article/details/6412759(链接1) 2、转载https://www.cnblogs.com/rohens-hbg/p/4957956.html(链接2) 函数原型(链接2)配合讲解(链接1)能够更好理解 C语言中函数strcpy ,strncpy ,strlcpy的用法 strcpy ,strncpy ,strlcpy的用法 好多人已经知道利用strncpy替代strcpy来防止缓冲区越界。 但是如果还要考虑运行效

流浪青春 6437

帆软报表导出各种格式之后台导出

我们前面介绍了帆软报表在界面上的导出是通过类似的URL:http://localhost:8075/webroot/decision/view/report?op=export&sessionID=10653244-3e46-408c-bc54-f89a214a9bc7&format=image&extype=PNG 来完成的,就是带OP=export以及format参数来完成的。如果不从界面传参数,比如我们自己实现了一个HTTP接口,也可以通过传参数format来完成各种格式的导

帆软爱好者的专栏 4270

Qt编程 segmentation fault (段错误)解决思路

下面错误显示应该是很多程序员编程时都会遇见类似的问题吧。程序执行过程中,就异常退出显示如下类似的代码: pure virtual method called terminate called without an active exception 相信很多初学者绞尽脑汁都找不出代码问题的所在处,要么百度、要么寻求大佬帮助。遇到此问题时,一定不要慌 ,要冷静,仔细的去检查代码。代码是自己编写的...

Tjmies的博客 2万+

VMware报错系列:虚拟机配置文件(.vmx)损坏或丢失---修复

虚拟机配置文件(.vmx)损坏或丢失---修复

weixin_54626591的博客 7011

【XCharts插件】5-2、从Excel中读取数据并更新图表案例(v3.0)

XCharts插件是一款基于UGUI的功能强大、易用、参数可配置的数据可视化图表插件。【Unity3D插件】XCharts插件完全教程《全网最全》-专栏文章目录【XCharts插件】5-1、从Json中读取数据并更新图表案例(v3.0)介绍了如何从Json文件中读取数据,并更新表格,这篇文章就介绍如何从Excel中读取数据,并更新图表吧。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1274

strlcpy和strncpy的参数,返回值,使用示例

strlcpy 是一个用于字符串复制的函数,与 strcpy 不同的是,它会在复制的同时确保目标缓冲区不会溢出。这是一个很有用的函数,因为它可以防止常见的缓冲区溢出问题。strncpy 是 C 标准库中的一个函数,用于将一个字符串的一部分复制到另一个字符串中,同时指定要复制的最大字符数。但是需要注意的是,strncpy 在处理目标缓冲区溢出时可能会有一些问题。dest:目标字符串,用于存储复制的内容。src:源字符串,要复制的内容。n:要复制的最大字符数。

qq_45673733的博客 2107

【微服务】Spring AI Alibaba Jmus 从部署到项目实战详解

Spring AI Alibaba Jmus 从部署到项目实战详解

congge 4186

strcpy ,strncpy ,strlcpy(转载)

好多人已经知道利用strncpy替代strcpy来防止缓冲区越界。 但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式。 1. strcpy 我们知道,strcpy 是依据\0作为结束判断的,如果 to 的空间不够,则会引起 buffer overflow。strcpy 常规的实现代码如下(来自 OpenBSD 3.9): char * strcpy(char *t...

weixin_33711641的博客 206

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

strcpy ,strncpy ,strlcpy的用法

转载于:http://blog.chinaunix.net/uid-20797562-id-99311.html 好多人已经知道利用strncpy替代strcpy来防止缓冲区越界。 但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式。 strcpy 我们知道,strcpy 是依据 \0 作为结束判断的,如果 to 的空间不够,则会引起 buffer overflow。strcpy 常规的实现代码如下(来自 OpenBSD 3.9): char * strcpy(char *to, cons

流浪青春 638

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

(C)strcpy ,strncpy与strlcpy

1. 背景 好多人已经知道利用strncpy替代strcpy来防止缓冲区越界。 但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式。 2. strcpy strcpy 是依据 /0 作为结束判断的,如果 to 的空间不够,则会引起 buffer overflow。 strcpy 常规的实现代码如下: char * strcpy(char *to,...

aihuanyou6758的博客 205

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

(C)strcpy ,strncpy和strlcpy的基本用法

好多人已经知道利用strncpy替代strcpy来防止缓冲区越界。 但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式。 1. strcpy strcpy 是依据 /0 作为结束判断的,如果 to 的空间不够,则会引起 buffer overflow。strcpy 常规的实现代码如下: char * strcpy(char *to, const char ...

aihuanyou6758的博客 123

C语言中函数strcpy ,strncpy ,strlcpy的用法【转】

本文转载自:http://blog.youkuaiyun.com/tigerjibo/article/details/6412759 C语言中函数strcpy ,strncpy ,strlcpy的用法 strcpy ,strncpy ,strlcpy的用法 好多人已经知道利用strncpy替代strcpy来防止缓冲区越界。 但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式。 1. strcp...

zzb2760715357的博客 103

C++ strcpy strcpy_s strncpy strlcpy

strncpy的用法:它与strcpy的不同之处就在于复制n个字符,而不是把所有字符拷贝(包括结尾'\0')。 函数原型:char * strncpy(char *dst,const char * src, int n) 当src的长度小于n时,dst内的未复制空间用'\0'填充。否则,复制n个字符到dst,没有加'\0'。这里就要注意在字符串dst结尾处理加'\0'的情况了 strcpy ...

weixin_30537391的博客 97

strcpy ,strncpy ,strlcpy特点

简单描述一下三个函数:strcpy ,strncpy ,strlcpy;1. 首先,strcpy是最不安全拷贝字符串函数,因为src串的长度有时会很长。随后strncpy函数为了解决这个问题出现了,它对于字符串末尾的’\0’处理不是很好。例1:char str[12];strncpy(str, "hello world", 12);在例1中只会把str数组填满,但这个字...

weixin_33727510的博客 159

strcpy(非安全性) ,strncpy ,strlcpy(转载) .

一下是使用strcpy_s与strcpy的安全性比较  char szBuf[2] = {0};  strcpy_s(szBuf, 2, "12131");  //新的CRT函数  strcpy(szBuf,  "12131");    //老的CRT函数 上述代码,明显有缓冲区溢出的问题。 使用strcpy_s函数则会抛出一个异常。而使用strcpy函数的结果则未定,因为它错

ilove6的专栏 406

strcpy ,strncpy ,strlcpy 用法

好多人已经知道利用strncpy替代strcpy来防止缓冲区越界。但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式。 1. strcpy 我们知道,strcpy 是依据 \0 作为结束判断的,如果 to 的空间不够,则会引起 buffer overflow。strcpy 常规的实现代码如下(来自 OpenBSD 3.9): char * strcpy(char *to, c...

weixin_30952535的博客 88

strcpy(非安全性) ,strncpy ,strlcpy(转载)

一下是使用strcpy_s与strcpy的安全性比较  char szBuf[2] = {0};  strcpy_s(szBuf, 2, "12131");  //新的CRT函数  strcpy(szBuf,  "12131");    //老的CRT函数 上述代码,明显有缓冲区溢出的问题。 使用strcpy_s函数则会抛出一个异常。而使用strcpy函数的结果则未定,因为它错

伊梦 飞翔 782

strcpy、strncpy和strlcpy的用法

char * strcpy(char *to, const char *from) { char *save = to; for (; (*to = *from) != '\0'; ++from, ++to); return(save); } char * strncpy ( char * destination, const cha...

weixin_30951231的博客 70

C语言中函数strcpy ,strncpy ,strlcpy的用法

strcpy ,strncpy ,strlcpy的用法 好多人已经知道利用strncpy替代strcpy来防止缓冲区越界。 但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式。 1. strcpy strcpy 是依据 /0 作为结束判断的,如果 to 的空间不够,则会引起 buffer overflow。strcpy 常规的实现代码如下(来自 OpenBSD 3.9): ...

weixin_33964094的博客 98
上一篇: IE8初步体验
下一篇: C++ Release版崩溃事后调试
oeichenwei
博客等级 码龄23年 8粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值