为什么用strlcpy取代strncpy

标签: CC语言strlcpystrncpy

标题: 为什么用strlcpy取代strncpy
作者: Demon
链接: http://demon.tw/copy-paste/strlcpy-replace-strncpy.html
版权: 本博客的所有文章,都遵守“署名-非商业性使用-相同方式共享 2.5 中国大陆”协议条款。

最近看模块代码,发现字符串的拷贝都用的strlcpy,所以就查了查用strlcpy取代strncpy的原因。

详细内容请看:http://www.gratisoft.us/todd/papers/strlcpy.html

简单总结几点: 
1. strcpy是最不安全拷贝字符串函数,因为src串的长度有时会很长。随后strncpy函数为了解决这个问题出现了,但这个函数有些地方实现得也很诡异,它对于字符串末尾的’\0’处理不是很好。

例1: 
char str[11]; 
strncpy(str, "hello world", 11);

在例1中只会把str数组填满,但这个字符串却没有’\0’的结束符。

例2: 
char str[20]; 
strncpy(str, "sample", 15);

在例2中,15远远大于了字符串"sample"的长度,这时strncpy要在剩下的部分补充’\0’。首先说这样会影响效率,其次对于static或者calloc这样已经初始化的数组根本不需要填写’\0’。 
因此在使用strncpy拷贝字符串时,通常要这样写,

例3: 
strncpy(path, homedir, sizeof(path) – 1); 
path[sizeof(path) – 1] = ‘\0′;

2. 而strlcpy可以自动处理末尾’\0’的问题

size_t strlcpy(char *dst, const char *src, size_t size);

然而strlcpy不是ANSI C函数,一般在linux下使用。

原文链接:为什么用strlcpy取代strncpy

为什么用strlcpy取代strncpy的更多相关文章

  1. Strlcpy和strlcat——一致的、安全的字符串拷贝和串接函数【转】

    转自:http://blog.csdn.net/kailan818/article/details/6731772 英文原文: http://www.gratisoft.us/todd/papers/ ...

  2. linux内核驱动中对字符串的操作【转】

    转自:http://www.360doc.com/content/12/1224/10/3478092_255969530.shtml Linux内核中关于字符串的相关操作,首先包含头文件: #inc ...

  3. snprintf/strncpy/strlcpy速度测试

    速度测试代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <un ...

  4. C++ strcpy strcpy_s strncpy strlcpy

    strncpy的用法:它与strcpy的不同之处就在于复制n个字符,而不是把所有字符拷贝(包括结尾'\0'). 函数原型:char * strncpy(char *dst,const char * s ...

  5. C语言strcpy,strncpy和strlcpy讲解

    前言 C风格的字符串处理函数有很多,如strcpy().strcat()等等. strcpy与strcat char* strcpy (char* dest, const char* src); ch ...

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

    转自:http://blog.chinaunix.net/uid-20797562-id-99311.html strcpy ,strncpy ,strlcpy的用法好多人已经知道利用strncpy替 ...

  7. (C)strcpy ,strncpy与strlcpy

    1. 背景 好多人已经知道利用strncpy替代strcpy来防止缓冲区越界. 但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式. 2. strcpy strcpy 是依据 /0 作为 ...

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

    好多人已经知道利用strncpy替代strcpy来防止缓冲区越界. 但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式. 1. strcpy strcpy 是依据 /0 作为结束判断的, ...

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

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

随机推荐

  1. NOIP2005 day1 t1 谁拿了最多奖学金

    题目描述 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同: 1) 院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1 ...

  2. BZOJ 2286 [Sdoi2011]消耗战(虚树+树形DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2286 [题目大意] 出一棵边权树,每次给出一些关键点,求最小边割集, 使得1点与各个关 ...

  3. Java字节码文件结构---概述

    一.Class文件的结构概述: 是一连串的字节流(以自节为基本单位划分),里面包含的数据项按照固定的次序依次排列组成Class文件,文件内部不含分割符 当数据项的长度大于1B时候,按照高位在前的方式存 ...

  4. [转] Hibernate与 MyBatis的比较

    hibernateHibernateibatisIBATISMyBatismybatis 目录(?)[-] 第一章     Hibernate与MyBatis 1 Hibernate 简介 2 MyB ...

  5. hdu 5236 Article 概率dp

    Article Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5236 ...

  6. xcode在调试时无法查看变量值

    现象:在xcode中调试程序的时候,无论是鼠标指在变量上,还是在gdb中po命令都看不到内存中变量的值. 解决办法:在Project的Build中把 Optimization Level 设置成 No ...

  7. MYSQL数据库迁移总结

    Auth: JinDate: 2014-04-03 前端操作,后续测试对外开放不在本文 准备阶段操作阶段后续阶段 需求:phpcms和anquanzuo在一个mysql实例中anquanzuo有一张视 ...

  8. ARM地址重映射机制

    转:http://blog.csdn.net/yuanzhangmei1/article/details/8395028 ARM体系结构中,系统上电或复位后,处理器将从地址0x0处取第一条指令,因此, ...

  9. Eclipse启动时禁用不必要的验证。

    window>preferences>general>editors>text editors>Annotations,右边的Annotation type里,点选err ...

  10. javascript不依赖JS加载顺序事件对象实现

    背景: 在现在WEB开发中,稍复杂一点的页面,都会涉及到多个模块,尤其是类似seajs.LABjs.requireJS等模块工具出来后,前端开发者分模块开发已经慢慢变成一种习惯了,但是多个模块间的常常 ...