转自:http://blog.csdn.net/edwardlulinux/article/details/47134513

版权声明:本文为博主原创文章,未经博主允许不得转载。

首先来看一个司空见惯的c语言列子:
#include <stdio.h>
#include <string.h>

int main()
{
    unsigned char arry[] = {0x00,0x01,0x02,0x03};
    unsigned char dest[] = {0xff,0xff,0xff,0xff};

strncpy(dest,arry,sizeof(arry));

printf("dest[0] is %X\n",dest[0]);
    printf("dest[1] is %X\n",dest[1]);
    printf("dest[2] is %X\n",dest[2]);
    printf("dest[3] is %X\n",dest[3]);

return 0;
}

运行后发现了:
dest[0] is 0
dest[1] is 0
dest[2] is 0
dest[3] is 0
原来的数组中的数据怎么没有了?

傻眼了吧,就是这个问题困扰了我一个下午。不过最后感觉不对,可以用memcpy来完事。随后用memcpy代替,果然问题没有再出现。原来的数组中的数据依次被赋值为新的源地址数值。
百思不得其解,回家后打开电脑查看了一下strncpy原代码。发现了问题:

char* strncpy(char *dest, const char *src, size_t n)
{
    size_t i;

//Note 1:
    for (i = 0 ; i < n && src[i] != '\0' ; i++)
        dest[i] = src[i];
    //Note 2:
    for ( ; i < n ; i++)
        dest[i] = '\0';

return dest;
}

Note 1:
假设我们的源目的地址第一个字符为NULL (\0),那么第一个for循环立即返回。但是这个时候i取值为0。
Note 2:
随即进入第二个for循环,别忘了,i=0。那么在第二个for循环中巴dest第dest[1]个开始以后所有的数据都赋值为\0。

第二个for循环的本意是(当拷贝大小size n大于源字符串长度时候)把前面若干个字符拷贝后剩下的最后所有的字符格式化为\0。

原来是这样,好久没有用libc和string类的库函数了。突然这么一次还真是冷不丁的卡壳了。

记录下来,也算是为工作和学习做一次笔记。

strncpy 引起的思考,重新认识了strncpy这个函数【转】的更多相关文章

  1. 像计算机科学家一样思考python-第3章 函数

    在程序设计中,函数是指用于进行某种计算的一系列语句的有名称的组合.定义一个函数时,需要指定函数的名称并写下一系列程序语句.之后,就可以使用名称来“调用”这个函数 3.1函数调用 一个函数调用的例子 & ...

  2. [skill] strncpy里边有两个坑

    以前的笔记,今日翻出了复看了一下,转过来. ------------------------------------ 今天发现xxxdump中使用xxx_strncpy 替换 strncpy导致的bu ...

  3. 写高并发程序时慎用strncpy和sprintf

    分享一下最近做程序优化的一点小心得:在写高并发交易代码时要谨慎使用strncpy和sprintf. 下面详细介绍一下这样说的原因及建议实践: 1 慎用strncpy因为它的副作用极大 我们平时使用st ...

  4. 为什么用strlcpy取代strncpy

    为什么用strlcpy取代strncpy 标签: C, C语言, strlcpy, strncpy 标题: 为什么用strlcpy取代strncpy作者: Demon链接: http://demon. ...

  5. strcpy/strncpy/strcpy_s比较

    转载自:http://blog.csdn.net/caomiao2006/article/details/4766416 strcpy()是依据源串的/0作为结束判断的,不检查copy先的Buffer ...

  6. LoadRunner事务/集合点/思考时间详解(转)

    在LoadRunner的脚步编写中,有三个重要的概念:事务.集合点.思考时间. 一.事务: 事务又称为Transaction,我们为了衡量某个action的性能,需要在action的开始和结束位置插入 ...

  7. 关于C++函数思考1(缺省的六大函数)

    我们知道大神们在设计C++时候就给C++有六个默认的函数,所谓默认就是,无需我们这些程序猿们动手去写,仅仅要你在将类实例化.即创建一个对象,在利用对象进行数据操作时候,就会编译器自己主动调用默认的函数 ...

  8. loadrunner 事务、同步点和思考时间

    事务 在LoadRunner里,我们定义事务主要是为了度量服务器的性能.每个事务度量服务器响应指定的Vuser请求所有的时间,这些请求可以是简单任务,也可以是复杂任务. 要度量事务,需要插入Vuser ...

  9. LoadRunner几个重要的概念:事务、集合点、思考时间

    在LoadRunner的脚步编写中,有三个重要的概念:事务.集合点.思考时间 事务: 事务又称为Transaction,在LoadRunner中的定义如下:An end-to-end(browser- ...

随机推荐

  1. 合规P2P平台成PE/VC新宠

    013年是互联网金融元年,余额宝.百发等掀起了大众理财的新一轮高潮.P2P平台作为互联网金融模式之一,也受到市场的重点关注-在部分平台不断爆出风险事件的同时,业内较为成熟的平台也正成为PE/VC的新宠 ...

  2. C#非托管跨线程委托调试

    使用C#调用mingw的so文件,拿视频数据回wpf的界面进行显示,注册了回调函数.C++在调用回调函数时遇到了委托被回收的问题,提示:“类型的已垃圾回收委托进行了回调.这可能会导致应用程序崩溃.损坏 ...

  3. NO11——01背包

    # include <stdio.h> # include <stdlib.h> # include <string.h> # define max(x,y) x& ...

  4. Eclipse下JRebel6.5.0热部署插件安装、破解及配置

    发现一个问题:如果安装了jRebel,但是并未对项目添加jRebel监听时,如果重写jar包中的类, 虽然重写后的类会得到编译(classes中的class已经是修改后的class),但是并不会调用重 ...

  5. php 将数组存入cookie

    最近在做一个购物车的功能,需要将商品的ID和商品数量存入cookie,实际上,cookie是不能存数组的,因此需要用到序列化函数serialize() 函数解释: serialize()就是将PHP中 ...

  6. SQL SERVER 实用命令集锦

    1.根据关键字查询库中的存储过程,返回符合条件的存储过程名称 select distinct object_name(id) from syscomments where id in (select ...

  7. ActiveMQ+Zookeeper集群配置文档

    Zookeeper + ActiveMQ 集群整合配置文档 一:使用ZooKeeper实现的MasterSlave实现方式 是对ActiveMQ进行高可用的一种有效的解决方案, 高可用的原理:使用Zo ...

  8. 【bzoj3856】Monster 乱搞

    题目描述 你要打一只h点血的怪物,每回合你攻击会造成a点伤害,回合结束后怪物会回b点血,你每攻击k回合需要休息一次,该回合不能造成伤害.怪物血量降到0以下就会死亡,问最后能否打死怪物. 输入 Ther ...

  9. jQuery插件jquery.fullPage.js

    简介如今我们经常能看到全屏网站,尤其是国外网站.这些网站用几幅很大的图片或者色块做背景,再添加一些简单的内容,显得格外的高端大气上档次,比如 iPone 5C 的介绍页面.QQ浏览器的官方网站.百度史 ...

  10. 关于HTML中的object元素

    <object>元素:它主要用于定义网页中的多媒体,比如音频,视频,Java applets,PDF,Active和Flash.object标签内除了param标签外,其他的内容将在浏览器 ...