strcpy ,strncpy ,strlcpy的用法

好多人已经知道利用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) != '\0'; ++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 并不帮你保证 \0

结束。

char buf[8];

strncpy( buf, "abcdefgh", 8 );

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

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

char buf[80];

strncpy( buf, "abcdefgh", 79 );

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

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

strncpy(path, src, sizeof(path) - 1);

path[sizeof(path) - 1] = '\0';

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函数

///

strncpy

原型:extern   char   *strncpy(char   *dest,   char   *src,   int   n);

用法:#include

功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。

说明:

如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。

如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。

src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

返回指向dest的指针。

举例:

//   strncpy.c

#include

#include

main()

{

char   *s="Golden   Global   View";

char   *d="Hello,   GGV   Programmers";

char   *p=strdup(s);

clrscr();

textmode(0x00);     //   enable   6   lines   mode

strncpy(d,s,strlen(s));

printf("%s\n",d);

strncpy(p,s,strlen(d));

printf("%s",p);

getchar();

return   0;

}

------------------------------

memcpy

原型:extern   void   *memcpy(void   *dest,   void   *src,   unsigned   int   count);

用法:#include

功能:由src所指内存区域复制count个字节到dest所指内存区域。

说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。

举例:

//   memcpy.c

#include

#include

main()

{

char   *s="Golden   Global   View";

char   d[20];

clrscr();

memcpy(d,s,strlen(s));

d[strlen(s)]=0;

printf("%s",d);

getchar();

return   0;

}

函数名: strdup

功  能: 将串拷贝到新建的位置处

用  法: char *strdup(char *str);

程序例:

#include

#include

#include

int main(void)

{

char *dup_str, *string = "abcde";

dup_str = strdup(string);

printf("%s\n", dup_str);

free(dup_str);

return 0;

}

clrscr在conio.h里面。

函数名: clrscr

功能: 清除文本模式窗口

用法: void clrscr(void);

程序例:

#include

int main(void)

{int i;

clrscr();

for (i = 0; i < 20; i++)

cprintf("%d\r\n", i);

cprintf("\r\nPress any key to clear screen");

getch();

clrscr();

cprintf("The screen has been cleared!");

getch();

return 0;

}

C语言中函数strcpy &comma;strncpy &comma;strlcpy的用法

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

C语言中函数返回字符串的4中方法

C语言中函数返回字符串的4中方法 函数的构成部分:返回类型.函数名称.参数.函数主体 参数:函数调用时传入的参数称为实参,函数定义时出现的参数为形参 形参的作用在于接收实参传入的值,形参和函数内部的其 ...

c语言中函数的简单介绍

c语言中函数的介绍: 函数,简单的说就是代码的打包.存放在一个地方,当需要的时候调用. 函数分类: 1.无参无返回值函数 void func() 2.无参有返回值函数  int func() 3.有参 ...

c语言中函数参数入栈的顺序是什么?为什么

看到面试题C语言中函数参数的入栈顺序如何? 自己不知道,边上网找资料.下面是详细解释 #include void foo(int x, int y, int z){   ...

C语言中函数和指针的參数传递

近期写二叉树的数据结构实验.想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个样例讨论一下c语言中指针作为形參的函数中传递中隐藏的东西. 大家知道C++中有引用的概念,两个 ...

C语言中函数参数传递

C语言中函数参数传递的三种方式 (1)值传递,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值.(2)地址传递,就是把 ...

C语言中函数的调用方式

第一眼看到这样一个题目的我,心想除了如下的直接调用还能怎么调用呢? 1 void fun(void) 2 { 3 ...... 4 //你的代码 5 ..... 6 } 7 int main(void ...

Go语言中异常处理painc&lpar;&rpar;和recover&lpar;&rpar;的用法

Go语言中异常处理painc()和recover()的用法 1.Painc用法是:用于抛出错误.Recover()用法是:将Recover()写在defer中,并且在可能发生panic的地方之前,先调 ...

随机推荐

java 异常

异常简介 java中有Error和Exception Error:是程序无法处理的错误,表示运行应用程序中较严重问题.大多数错误与代码编写者执行操作无关,而表示运行时JVM出现的问题. Excepti ...

jquery easy ui combox

$(document).ready(function() { $.ajax({ type: 'POST', dataType: "json", url:'menu/getAll', ...

CSS &colon;focus 伪类

:focus -- CSS :focus 伪类,适用于已获取焦点的元素的样式 语法: :focus CSS版本:CSS2 说明: 适用于已获取焦点的元素的样式,例如:表单的input输入框可以输入文字 ...

Linux多任务编程——进程

进程编程常用函数 1--- fork pitd_t fork(void); 创建一个新的子进程,其父进程为调用 fork() 函数的进程: 返回值:成功:子进程返回 0,父进程返回 子进程 PID:失 ...

Android 开源库

http://www.cnblogs.com/hawkon/p/3593709.html

关于AIX VG中 LV 的状态问题,LV STATE

在数据库管理过程中常常遇见LV状态异常,而造成LV不能再次被使用的情况,那么AIX中LV的两种状态分别代表什么呢 如果是访问fs需要open,即创建文件系统并mount 文件系统LV STATE 才是 ...

关于V4L2中操作比较重要的几个命令以及一般操作流程总结

最近在做关于摄像头测试程序相关的一些开发,主要是想要实现在摄像头采集视频的过程中,通过按键来实现拍照,然后将拍照得到的数据保存到一个文件中,通过了解V4L2的一些相关操作,原来,拍照后的数据是保存在一 ...

git 命令详细

git是代码管理工具 github是基于git实现的代码管理平台 git --version 查看git版本 git remote -v 查看clone地址 git init 初始化git //全局设 ...

CF 960 G

难受的1b,怎么会这样 先去学写一发 NTT 大概说一下斯特林数

如何确保Memcache数据读写操作的原子性(转)

什么是CAS协议 Memcached于1.2.4版本新增CAS(Check and Set)协议类同于Java并发的CAS(Compare and Swap)原子操作,处理同一item被多个线程更改过 ...

c语言中strncpy的用法,C语言中函数strcpy ,strncpy ,strlcpy的用法【转】相关推荐

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

    C语言中函数strcpy ,strncpy ,strlcpy的用法 http://hi.baidu.com/qi_hao/blog/item/043ef21c6e26c58286d6b678.html ...

  2. linux strcpy函数,C语言中函数strcpy ,strncpy ,strlcpy,strcpy_s的用法

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

  3. c语言 字符串 strncpy,详解c语言中的 strcpy和strncpy字符串函数使用

    详解c语言中的 strcpy和strncpy字符串函数使用 strcpy 和strcnpy函数--字符串复制函数. 1.strcpy函数 函数原型:char *strcpy(char *dst,cha ...

  4. c语言中fopen的作用,c语言fopen函数的用法

    在c语言中可以使用"fopen()"函数打开一个文件,该函数用于打开一个文件,其语法是"open("file a","r");&q ...

  5. ab 是什么意思C语言中,a/b在c语言中什么意思,c语言中ab是什么意思

    Q1:c语言中y=(x=a+b,b+c)代表什么意思 x=a+b表达式使得x=6,其返回值为X(x,b+c)是逗号表达式,逗号表达式的值为最后一个子表达式的值所以 y=b+c y=10 Q2:C语言中 ...

  6. c语言中getenv的作用,C语言putenv()函数和getenv()函数的使用详解

    C语言putenv()函数和getenv()函数的使用详解 C语言putenv()函数:改变或增加环境变量头文件: #include4 定义函数: int putenv(const char * st ...

  7. c语言中find的作用,c语言find函数的使用方法

    c语言find函数的使用方法 发布时间:2020-04-29 11:09:07 来源:亿速云 阅读:449 作者:小新 这篇文章主要给大家介绍了关c语言find函数的使用方法,文中通过示例代码介绍的非 ...

  8. c语言中0x11是多少,C语言中的符号

    C语言中的符号 运算符的种类C语言的运算符可分为以下几类: 1.算术运算符 用于各类数值运算.包括加(+).减(-).乘(*).除(/).求余(或称模运算,%).自增(++).自减(–)共七种. 2. ...

  9. c语言中long输入字符串,C语言strtol函数

    C语言strtol函数教程 在 strtol函数详解 语法 long int strtol(const char *str, char **endptr, int base); 参数 参数 描述 st ...

  10. python中什么是关键字参数_如何使用python语言中函数的关键字参数的用法

    一般情况下,在调用函数时,使用的是位置参数,即是按照参数的位置来传值:关键字参数是按照定义函数传入的参数名称来传值的.那么,关键字参数怎么使用? 工具/原料 python pycharm 截图工具 W ...

最新文章

  1. 整理了 25 个 Pandas 实用技巧,拿走不谢!
  2. 【移动开发】Android中三种超实用的滑屏方式汇总(ViewPager、ViewFlipper、ViewFlow)...
  3. (chap4 IP协议) CIDR协议
  4. shtml与php的区别,htm,html.shtml区别
  5. 有一整片蓝天 停住时间。
  6. WPF快速入门系列(2)——深入解析依赖属性
  7. 在java中原始时间_Java 日期时间
  8. 空间插值方法对比整理
  9. linux平台设备驱动模型是什么意思,Linux设备驱动模型之我理解
  10. C++: find()函数的注意事项
  11. 用汇编语言实现itoa函数
  12. HTML5学习总结(1)——HTML5基础知识
  13. 噢,原来SpringCloud是这样的呀!
  14. python绘图--由逐日风场数据计算月平均风场数据并绘制二维填色图
  15. GLM(广义线性模型) 与 LR(逻辑回归) 详解
  16. 弘兵金融学院 站在山顶 看不见山
  17. Android自动化测试应用:uiautomatorviewer工具的安装与使用
  18. 数智化转型赋能方法论与服务路径
  19. SAP 详细分析BOM物料清单
  20. windows同时代服务器系统,从Win95到Win10:那些年让你痴迷的系统特性大盘点

热门文章

  1. 【python教程入门学习】Python爬虫入门学习:网络爬虫是什么
  2. Blender源代码编译(VS2019、win64_vc15)
  3. 韩顺平 Java集合 自学笔记(Java30天基础)
  4. [NOIP2013]表达式求值
  5. Python学习手册~笔记1
  6. HTML5前端教程分享:JavaScript学习指南
  7. Davids阅读笔记:《Redis设计与实现》
  8. 统计学的Python实现-013:频度分布表
  9. 微信小程序图片全屏显示
  10. (附源码)spring boot网上购物平台 毕业设计 141422