博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
strncpy 引起的思考,重新认识了strncpy这个函数【转】
阅读量:7040 次
发布时间:2019-06-28

本文共 1235 字,大约阅读时间需要 4 分钟。

首先来看一个司空见惯的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类的库函数了。突然这么一次还真是冷不丁的卡壳了。
记录下来,也算是为工作和学习做一次笔记。
【作者】
【出处】
【博客园】
【新浪博客】
【知乎】
【我的作品---旋转倒立摆】
【我的作品---自平衡自动循迹车】
【新浪微博】 张昺华--sky
【twitter】 @sky2030_
【facebook】 张昺华 zhangbinghua
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
你可能感兴趣的文章
带你了解webpack
查看>>
基于 Postgres 实现一个热度算法
查看>>
Go基础学习记录 - 编写Web应用程序 - 博客编辑功能完善
查看>>
快速学习nodejs系列:十三、nodejs实现restful api、cookie、session、爬虫小例子
查看>>
【CSS】CSS 世界 -- 元素的显示与隐藏学习总结
查看>>
据说这道JAVA基础题,面试中给出正确答案的人数不到32%
查看>>
yum - epel源
查看>>
胶囊网络到底是什么东东?
查看>>
Vue中响应式数据失效&Dom操作无效问题
查看>>
【前端芝士树】Js中的闭包是怎么一回事 && 笔试问题集锦
查看>>
【基础】固定列宽的表格及示例演示
查看>>
yarn简介
查看>>
基于H5实现的react拖拽排序组件
查看>>
【Flutter 学习笔记二】Dart 的基础概念和数据类型
查看>>
zepto源码ajax模块学习
查看>>
Vue v-for渲染页面,获取不到DOM元素解析
查看>>
一个典型案例为你解读TDSQL 全时态数据库系统
查看>>
视频云资深技术专家李彬:传统企业如何进行多媒体数字化转型?
查看>>
1. Two Sum (Easy)
查看>>
【linux】与 用户、权限 有关的常用命令
查看>>