strncpy()功能

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

使用方法:#include <string.h>   

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

说明:假设src的前n个字节不含NULL字符。则结果不会以NULL字符结束。       

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

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

返回指向dest的指针(该指向dest的最后一个元素)   

     

相关函数:memccpy,memcpy,stpcpy,strcpy

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   <string.h>  

       

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

说明:  

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

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

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

返回指向dest的指针。  

       

      举例:  

   

   

              //   strncpy.c  

               

              #include   <syslib.h>  

              #include   <string.h>  

   

              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;  

              }

查看文章strncpy()功能更好的文章的更多相关文章

  1. 一步步开发自己的博客 .NET版(4、文章发布功能)百度编辑器

    前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做个插件,任何网站上的技术 ...

  2. Redis实现文章投票功能

    Redis的具体操作这里就不说了,说一下需求和设计思路. 需求:自己实现一个文章投票的功能1.能够按照时间分页倒叙查看文章信息2.能够给文章投票,一个用户给一篇文章只能投票一次3.需要记录分值.每次投 ...

  3. phpcms 移植【添加相关文章】功能

    添加相关文章功能相当有用,移植一个过来基本上可以实现比较复杂的页面内包含分类功能,做二次开发时可以省下不少力气. 用例:如果一个产品,属于一个厂家,而这个厂家是动态添加的,既不是一个分类,而是一个厂家 ...

  4. 通过localstorage和cookie实现记录文章的功能

    我们在做页面的时候,会考虑记录用户曾经看过的文章的功能,并记录下来在页面中显示!但是在IE低版本的下是不支持localstorage的功能,只能采用cookie来代替本地存储的功能!实现的方法如下! ...

  5. github+hexo搭建自己的博客网站(三)主题之外的一些基本配置(图片位置,文章目录功能)

    使用的yilia主题之后,还需要进行自己的定制配置 1.图片的位置 比如打赏的支付宝二维码图片,是在当前博客的source/assets/img/下 (不是当前主题) 配置:(在yilia主题下文件里 ...

  6. 基于SpringBoot从零构建博客网站 - 分页显示文章列表功能

    显示文章列表一般都是采用分页显示,比如每页10篇文章显示.这样就不用每次就将所有的文章查询出来,而且当文章数量特别多的时候,如果一次性查询出来很容易出现OOM异常. 后台的分页插件采用的是mybati ...

  7. 用 Flask 来写个轻博客 (30) — 使用 Flask-Admin 增强文章管理功能

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 实现文章管理功能 实现效果 前文列表 用 Flask 来写个 ...

  8. 使用redis实现【统计文章阅读量】及【最热文章】功能

    1.视图函数 # 不需要登录装饰器,匿名用户也可访问def article_detail(request, id, slug): # print(slug,id) article = get_obje ...

  9. 分析WordPress数据表之文章表(功能篇)

    数据表分析 wp_posts(文章表) 表字段如下:ID(文章ID)post_author(文章作者名,我想可以是为用户名,也可以是用户ID)post_date(文章发布日期)post_date_gm ...

随机推荐

  1. WebSocket是一种协议

    WebSocket,并非HTML 5独有,WebSocket是一种协议.只是在handshake的时候,发送的链接信息头和HTTP相似.HTML 5只是实现了WebSocket的客户端.其实,难点在于 ...

  2. linux 怎么使用一个c/c++库

    linux 怎么使用一个c/c++库 使用一个库,库有动态和静态之分. 静态库只要能够编译通过,运行时就没有提示缺少这个库可能,因为把这个库就是这个使用者的一部分了.动态库.两部分.1 库信息的注册 ...

  3. 在安装mysql出现的错误以及解决方法

    因为手贱更新了一下驱动,结果导致无线网卡出了问题.然而就算是从官网上下载了驱动各种折腾也没有弄好,心里特别堵.无奈只有重装系统这一条路了.这里表示特别难过,因为电脑上东西实在太多了,而且各种环境变量. ...

  4. Storyboard 经常用法总结-精华版

    1.prepareForSegue: Now we know what the destinationViewController is we can set its data properties. ...

  5. 自己动手写处理器之第一阶段(2)——MIPS指令集架构的演变

    将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第三篇.我尽量每周四篇 MIPS指令集架构自上世纪80年代出现后.一直在进行着更新换代,从最初的MIPS I到MIPS V,发 ...

  6. 黑马程序员:Java基础总结----静态代理模式&动态代理

    黑马程序员:Java基础总结 静态代理模式&动态代理   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 静态代理模式 public  class  Ts {   ...

  7. 开源mp3播放器--madplay 编译和移植 简记

    madplay是一款开源的mp3播放器. http://madplay.sourcearchive.com/ 下面简单记录一下madplay的编译与移植到ARM开发板上的过程 一.编译x86版本的ma ...

  8. 非对称加密RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。使用最广泛的是RSA算法

          非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey).公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密:如果用私 ...

  9. 激动啊,终于诞生了,编译了属于俺自己的 JDK

    激动啊,终于诞生了,编译了属于俺自己的 JDK  折腾了2天,现在编译过去了 30多分钟了,久违的 java.exe 终于出现在了 bin 目录中,属于俺自己的 JDK 终于诞生了,激动啊

  10. AW笔记本升级SSD,外接双屏中的一些注意事项

    自己留一个mark,以后提醒用. 1)机械硬盘状态下利用alien sprawn创建的系统恢复U盘,无法在SSD下使用,由于SSD中没有recovery分区,仅仅能使用随机携带的系统恢复光盘: 2)最 ...