美文网首页
当strncpy遇上指针

当strncpy遇上指针

作者: 睡猫读书 | 来源:发表于2019-11-18 21:22 被阅读0次

随着对代码安全性的要求越来越高,strncpy正式登上了历史舞台。

strncpy在项目中使用较多,一不注意可能会出错,因此记录一下,方便后续翻阅查看。

strncpy函数原型

    char * strncpy(char * str2, char * str1, int size);

基本用法

    char src[20] = {0};
    strncpy(src, "This is test string", sizeof(src)-1);
    printf("src[%s]\n", src);

打印结果为:

    src[This is test ]

遇到指针之后

    char src[20] = {0};
    strncpy(src, "This is test string", sizeof(src)-1);

    char* dst = (char*)malloc(20);
    strncpy(dst, src, sizeof(dst)-1);
    printf("src[%s],len[%d]\ndst[%s],len[%d]\n", src, strlen(src), dst, strlen(dst));

运行结果如下:

    src[This is test ],len[19]
    dst[Thi],len[3]

我们发现运行结果出现了异常。原因的sizeof计算指针变量的大小时,并不是返回指针所指向的空间的大小,而是指针变量本身的大小,在32位系统中为4字节,因此,目标字符串长度为3,被无意间截断了。

为了避免这种情况,我们常使用如下方式调用strncpy:

    char src[20] = {0};
    strncpy(src, "This is test string", sizeof(src)-1);

    char* dst = (char*)malloc(20);
    strncpy(dst, src, strlen(src)+1);
    printf("src[%s],len[%d]\ndst[%s],len[%d]\n", src, strlen(src), dst, strlen(dst));

此时,结果就正常了。

注意,此时使用的是strlen(src)+1,而不是strlen(dst)-1。

总结

  • 安全拷贝字符串,使用strncpy函数
  • 注意拷贝字符串的长度计算,字符数组可使用sizeof计算,字符指针需要使用原字符串长度(strlen(src)+1),+1是因为当拷贝的长度size大于待拷贝字符串长度时,strncpy函数会在后面自动补上'\0'。我们多拷贝一个字符,相当于让strncpy函数帮忙在目标字符串结尾加上'\0'结束符。
  • sizeof计算指针变量长度,是int类型在该系统所占内存的大小

相关文章

  • 当strncpy遇上指针

    随着对代码安全性的要求越来越高,strncpy正式登上了历史舞台。 strncpy在项目中使用较多,一不注意可能会...

  • 程序员恋上诗

    当堆遇上诗 为她在大海边买了一套房 做小三的指针不情愿 给捅了个大窟窿 天上的星星怜香惜玉 整晚陪她赏月 当栈遇上...

  • C语言strncpy()函数:复制字符串的前n个字符

    头文件:#include strncpy()用来复制字符串的前n个字符,其原型为:char * strncpy(c...

  • Strcpy & Strncpy

    Strcpy strcpy是一种C语言的标准库函数,strcpy把从src地址开始且含有'\0'结束符的字符串复制...

  • c语言字符串处理函数

    gets()fgets()puts()fputs()strlen()strcpy()strncpy()strcat...

  • linux内核遨游之旅—引子

    从strncpy的实现说起 第一次阅读内核源码是在网上浏览博客的时候,有个博主说strncpy的执行效率很低,而且...

  • C++之函数重载(下)

    重载与指针 函数重载遇上函数指针将重载函数名赋值给函数指针时根据重载规则挑选与函数指针参数列表一致的侯选者严格匹配...

  • 你我之间最美的遇见

    当青椒遇上互加,当课程遇上学校,当学生遇上平板,所有的美好便从这一刻开始了… 当,当,当,当…开学...

  • 【转】不说,是一种智慧

    当流年遇上了光阴荏苒,不说; 当生命遇上了疾病和磨难,不说; 当阳光遇上了空气和鲜花,不说; 当友情遇上了误解和嫉...

  • 追梦

    当黄昏遇上海浪, 当海鸥遇上蓝天, 当珊瑚遇上沙滩, 当我们遇上你—年轻的日照, 一切都刚刚好。 微风追逐着海浪,...

网友评论

      本文标题:当strncpy遇上指针

      本文链接:https://www.haomeiwen.com/subject/klciictx.html