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. java Date 和 javascript Date

    近期写一个页面.上面要展示下日期. 在Java中生成了Date.然后将这个Date通过velocity送入vm模板其中 代码例如以下: var dates = new Date("$!{pp ...

  2. c语言实现动态指针数组Dynamic arrays

    c语言实现动态数组.其它c的数据结构实现,hashTable參考点击打开链接 treeStruct參考点击打开链接 基本原理:事先准备好一个固定长度的数组. 假设长度不够的时候.realloc一块区域 ...

  3. ABAP 中 Table Control例子

    实现了Table Control的主要的一些功能,可以作为例子参考,实现的功能有是否可编辑切换,选择某一条记录点击按钮显示详细信息,新增记录,删除记录,选择所有记录,选择光标所有记录,取消选择所有,排 ...

  4. MQ、JMS以及ActiveMQ

    MQ简介: MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们.消息传 ...

  5. 深入探讨:LBS是一种工具而非一种模式

    移动互联网的快速发展,带动着移动互联网应用的不断创新.从2010起,LBS的概念就在中国迅速兴起,但到了2011年底提供LBS服务的企业从最多50家已经降至仅剩15家.投行在看好移动互联网的同时又对L ...

  6. queue C++

    #include <iostream> using namespace std; class DequeEmptyException { public: DequeEmptyExcepti ...

  7. 小猪的Android入门之路 day 1

    小猪的Android入门之路 Day 1 Android相关背景与开发环境的搭建 ------转载请注明出处:coder-pig 本节引言: 随着社会经济的发展,移动互联网的越来越热,手机APP开发显 ...

  8. 在navigationItem中添加搜索栏

    给navigationItem中添加个搜索栏,效果和大部分程序一样.代码如下: UISearchBar *searchBar = [[UISearchBaralloc] initWithFrame:C ...

  9. C# openfiledialog设置filter属性后达不到过滤效果的原因之一

    此处用RichTextBox控件举例>>> 在窗体对应的类中处理Load事件可以为openfiledialog设置Filter的属性: private void Form1_Load ...

  10. random_shuffle (stl算法)打乱顺序 - 飞不会的日志 - 网易博客

    random_shuffle (stl算法)打乱顺序 - 飞不会的日志 - 网易博客 random_shuffle (stl算法)打乱顺序 2012-03-31 10:39:11|  分类: 算法 | ...