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. 深入分析redis cluster 集群

    深入分析redis cluster 集群安装配置详解 下面小编来为各位介绍一篇深入分析redis cluster 集群安装配置详解,如果你希望做数据库集群就可以来看看此文章的哦. http://rub ...

  2. haproxy配置监控redis主备切换(转)

    环境前提:     redis sentinel配置,三台主机,且配置运行良好        配置文件中添加: frontend ft_redis  bind 0.0.0.0:6379 name re ...

  3. oracle查询语句中case when的使用

    case when语句语法如下: case when  表达式  then valueA  else valueB  end; 具体使用如下: select    (case when a.colum ...

  4. CentOS 6.4下编译安装MySQL 5.6.16

    一.卸载旧版本号MySql 1.rpm卸载: 1> 检查安装包: rpm -qa | grep mysql 2> 普通删除: rpm -e mysql-5.6.16.rpm 3> 强 ...

  5. TWinControl的消息覆盖函数大全(41个WM_函数和31个CM_函数,它的WndProc就处理鼠标(转发)、键盘(取消拖动)、焦点、和WM_NCHITTEST一共4类消息)

    注意,这些函数只有Private一种形式(也就是不允许覆盖,但仍在动态表格中): 其中TWinControl对TControl有10个消息进行了覆盖(红色标记),其中有2个是WM_消息,8个是CM_消 ...

  6. 有时候碰到String赋值就出错,原因有三

    1. String所在的对象,根本就不存在(不是String不存在,而是它所属的类对象不存在) 2. 增加一个String作为类元素后,运行直接就崩溃.一次又一次找原因,结果发现,只需要完全重编译就行 ...

  7. Visual Studio 2008中FormatX源代码格式化插件

    原地址:http://www.cr173.com/html/15492_1.html 我总是对组里的兄弟代码规范性近乎完美的要求,举个简单的例子: 1.  每个方法必须有注释,方法参数详细说明 2.  ...

  8. Fitnesse使用系列二

    决策表 Fitnesse中提供了好几种表格样式,前面说了.表格是运行測试的关键.从字面看.表格描写叙述的是測试用例.从运行角度看,表格为后端的代码(fitnesse里称作fixture)提供了包名.类 ...

  9. CCEditBox/CCEditBoxImplIOS

    #ifndef __CCEditBoxIMPLIOS_H__ #define __CCEditBoxIMPLIOS_H__ #include "cocos2d.h" #if (CC ...

  10. oracle 之 内存—鞭辟近里(四)

    oracle 之 内存—鞭辟近里(四) 今天是2013-07-11日,首先我非常感谢我的哥们也是我的网友杨工,非常感谢他能在大数据库内帮我执行一下我所需要的信息.就是他说的网络真是一个互助友爱的平台. ...