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. js 常用正则表达式分析详解

    1.整数或者小数:/^((0{1}|[1-9]{1}[0-9]+)\.{1}[0-9]+|[1-9]{1}[0-9]*|0)$/ 分析:分类讨论,如果是小数,则有两种形式   0.111对应的是 0{ ...

  2. python转换时间戳和日期时间格式的转换

    [steven@txzxp2 seccenter]$ python Python 2.7.5 (default, Jul  8 2013, 09:48:59)  [GCC 4.8.1 20130603 ...

  3. leetcode第一刷_Largest Rectangle in Histogram

    非常难的问题,数组线性时间. 属于我之前说的解法的借助辅助空间.给定两个柱子,他们之间的面积由什么确定呢?没错,他们之间的距离和他们之间最矮的那个柱子的高度.我们并不知道这个柱子在什么位置,所以仅仅能 ...

  4. C++基础之---union联合体大小分析

    #include <iostream> using namespace std; union un { int a[7]; double b; char c[10]; int d[3]; ...

  5. What is tradebit?

    The Tradebit Fact Sheet What is tradebit?

  6. 慕尼黑大学公开课 Competitive Strategy(竞争策略)总结

    第一章博弈 同时的博弈:双方同时定制策略 如果有显著的次优策略总是不如另一个,则剔除它. 如果一个策略组合中没有一方可以单独改变其策略以提高回报,则称为Nash均衡.一个游戏可能没有也可能有多个Nas ...

  7. Android中&lt;meta-data&gt;的使用

    在AndroidManifest.xml中.<meta-data>元素能够作为子元素,被包括在<activity>.<application> .<servi ...

  8. Android登陆界面实现-支持输入框清楚和震动效果功能

    演示效果 主要代码例如以下 自己定义的一个EditText.用于实现有文字的时候显示能够清楚的button: import android.content.Context; import androi ...

  9. CentOS 7单用户模式修改root密码

    CentOS 7的单用户模式和6.5稍有不同 把ro改成 "rw init=/sysroot/bin/sh". 完成之后按 "Ctrl+x" chroot /s ...

  10. hbase总结(二)-hbase安装

    本篇介绍两种HBase的安装方式:本地安装方式和伪分布式安装方式. 安装的前提条件是已经安装成功了hadoop,并且hadoop的版本号要和hbase的版本号相匹配. 我将要安装的hbase是hbas ...