转自: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类的库函数了。突然这么一次还真是冷不丁的卡壳了。

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

最新文章

  1. ASP.NET绑定控件语法
  2. HighCharts入门
  3. iOS - Swift NSProcessInfo 系统进程信息
  4. OC1-XML文件解析
  5. web服务器和应用服务器概念比较
  6. Mysql创建表时报错Table doesn&#39;t exist解决办法
  7. bzoj 1056 [HAOI2008]排名系统(1862 [Zjoi2006]GameZ游戏排名系统)
  8. Echarts动态数据显示
  9. MVC中,视图的Layout使用
  10. .net core页面使用layui的HtmlHelper扩展
  11. 使用Remix编译和部署以太坊智能合约
  12. Android性能优化之常见的内存泄漏
  13. Linux下实现秒级定时任务的两种方案(crontab 每秒运行)
  14. Python2.X和Python3.X的w7同时安装使用
  15. 知识扩展——Git和GitHub的区别
  16. HashMap与Hashtable
  17. React-router4 第九篇 Ambiguous Matches 模糊匹配
  18. node.js 基础二 开启服务器监听
  19. 大数据小视角5:探究SSD写放大的成因与解决思路
  20. 【Python】【Web.py】详细解读Python的web.py框架下的application.py模块

热门文章

  1. Selenium 启动无头浏览器,只有chrome 和 firefox的,没有IE
  2. ardupilot_gazebo仿真(三)
  3. JavaScript - arguments object
  4. BZOJ 3597 SCOI2014 方伯伯送椰子 网络流分析+SPFA
  5. 第5讲——cin处理字符输入
  6. android自定义View绘制圆形头像与椭圆头像
  7. setCharacterEncoding 是在request.getParameter获取参数之前 设置request的编码格式 一步到位
  8. request对数据进行编码的 才是导致乱码问题之一
  9. Phaser的timer用法
  10. NOIP2010 codevs1069 洛谷P1525 关押罪犯