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

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;

}

时间: 2025-01-02 14:29:34

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

博客项目实现文章评论功能(重点是评论回复)

我开发的博客网站的地址:http://118.89.29.170/RiXiang_blog/ 博客项目代码github:https://github.com/SonnAdolf/sonne_blog 有了我的已成型的项目和代码,可以更容易理解这篇文章. 本篇文章记录下自己博客项目评论功能实现的全过程,重点其实是评论回复功能. [一,写评论] 写评论部分我没有使用富文本编辑器,只是单纯地使用了textarea标签,所以后台不需要作html标签的白名单检验(关于防范xss攻击,可以看我之前的一篇文章

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

前言 这次开发的博客主要功能或特点:    第一:可以兼容各终端,特别是手机端.    第二:到时会用到大量html5,炫啊.    第三:导入博客园的精华文章,并做分类.(不要封我)    第四:做个插件,任何网站上的技术文章都可以转发收藏 到本博客. 所以打算写个系类:<一步步搭建自己的博客> 一.一步步开发自己的博客  .NET版(1.页面布局.blog迁移.数据加载) 二.一步步开发自己的博客  .NET版(2.评论功能) 三.一步步开发自己的博客  .NET版(3.注册登录功能) 四

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

使用的yilia主题之后,还需要进行自己的定制配置 1.图片的位置 比如打赏的支付宝二维码图片,是在当前博客的source/assets/img/下 (不是当前主题) 配置:(在yilia主题下文件里themes\yilia文件夹下的_config.yml) # 打赏基础设定:0-关闭打赏: 1-文章对应的md文件里有reward:true属性,才有打赏: 2-所有文章均有打赏 reward_type: 1 # 打赏wording reward_wording: '谢谢你请我吃糖果' # 支付宝

推荐实用的公众号(一)--微信文章打赏功能

在这家公众号里,可以使用文章打赏工具. 风信子同学录的小伙伴们也有一份九月的惊喜——风信子的后台工作团队,为你的美文点赞!点赞还不足以表达我们的态度,真金白银献给你! 活动规则 ☆ 凡在10月份发布的文章,如果通过了风信子主编的认可,列入了“推荐”,风信子客服小开会立即打赏 5 元! 注意: 1 主编喜欢优美.正能量.原创的文章 2 文章被推荐后人人都可打赏 3 计算“打赏人次”时,重复的打赏人不算 怎样才能被推荐? 1 文章写得好 2 发布文章时,不要去掉“允许风信子同学录推荐”的勾选 3 在

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

添加相关文章功能相当有用,移植一个过来基本上可以实现比较复杂的页面内包含分类功能,做二次开发时可以省下不少力气. 用例:如果一个产品,属于一个厂家,而这个厂家是动态添加的,既不是一个分类,而是一个厂家的模型,这二者关联的时候使用这个添加相关的功能可以轻易实现. 学会使用phpcms中的类别管理和推荐位管理基本上可以满足文章管理的多数场景,如果能够理解mysql表的设计,可以使用模型管理这个大杀器, 基本上能够想到的功能都能实现,最后再对[添加相关文章]功能进行设计和移植,模型功能能够再次爆发威力

Node.js 博客实例(十一)文章检索功能

原教程 https://github.com/nswbmw/N-blog/wiki/_pages的第十一章,由于版本等的原因,在原教程基础上稍加改动即可实现. 现在我们来给博客增加文章检索功能,即根据关键字模糊查询文章标题,且字母不区分大小写. 首先,我们修改 header.ejs ,在 </nav> 前添加一行代码: <span><form action="/search" method="GET"><input type

文章详情页文章评论功能

一.文章评论功能实现流程 文章评论包含两种评论,根评论:对文章的评论:子评论:对评论的评论.两者的区别在于是否存在父评论. 实现流程:1.构建样式:2.提交根评论:3.显示根评论(分为render显示和Ajax显示):4.提交子评论:5.显示子评论(分为render显示和Ajax显示):6.评论树显示(博客园是楼层显示). 二.构建评论样式 1.article_detail.html: {# 文章点赞,清除浮动 #} <div class="clearfix"> <d

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

1.视图函数 # 不需要登录装饰器,匿名用户也可访问def article_detail(request, id, slug): # print(slug,id) article = get_object_or_404(ArticlePost, id=id, slug=slug) # 连接redis r = redis.StrictRedis(host=settings.REDIS_HOST, port=settings.REDIS_PORT, db=settings.REDIS_DB) # 总

ASP.NET MVC文章附加有源码下载的文章

很多一段时间以来,Insus.NET有分享很多有关ASP.NET MVC的文章,每隔一段时间,会把源码以及数据库分享供大家下载. 你可以按时间排序,文章越新,源码以及数据数据也就越新. 你可以从下面的文章或是评论中,找到下载链接.另外正常情况之下,数据库的版本为SQL2014的,如果你需要SQL2008 R2的,下面提供的链接下可以找到相关的.2013-10-13:<MVC显示详细记录Without Entity Framework> http://www.cnblogs.com/insus/