zoukankan      html  css  js  c++  java
  • linux下snprintf和sprinf很少被提及的区别

    函数原型:int snprintf(char *dest, size_t size, const char *fmt, ...);
    函数说明:

    snprintf函数中的第二个参数,size的解释:size是限定最终生成的dest的字符数,最多拷贝size-1个字符; 一般情况下size会取sizeof(dest),这是为了dst不溢出. 在snprintf(dest, size, "str: %s ", src)中如果size-1大于等于"str: %s "的长度,则把"str: %s "都拷贝到dst, 如果size-1小于"str: %s "的长度,则从"str: %s "拷贝size-1长度的字符串到dst,并且末尾置.

    至于sprintf的的溢出,网上很多。再次不做说明。下面说说很少被提及到的区别:

    先上代码1:

     1 #include<stdio.h>
     2 #include<stdio.h>
     3 #include<string.h>
     4 #include<stdlib.h>
     5 int main()
     6 {
     7     int i = 10;
     8     char tmp[128] = {0};
     9     char tmp_name[128] = "download";
    10     char file_name[128]={0};
    11     strcpy(file_name,"./");
    12     strcat(file_name,tmp_name);
    13     strcat(file_name,"/");
    14     sprintf(file_name,"%s%d",file_name,i);
    15     printf("file_name is: %s
    ",file_name);
    16     return 0;
    17 }
    View Code

    执行结果:

    file_name is: ./downlaod/10

    代码2:

     2 #include<stdio.h>
     3 #include<string.h>
     4 #include<stdlib.h>
     5 int main()
     6 {
     7     int i = 10;
     8     char tmp[128] = {0};
     9     char tmp_name[128] = "download";
    10     char file_name[128]={0};
    11     strcpy(file_name,"./");
    12     strcat(file_name,tmp_name);
    13     strcat(file_name,"/");
    14     snprintf(tmp, sizeof(tmp), "%s",file_name);
    15     snprintf(file_name, sizeof(file_name), "%s%d",tmp,i);
    16     printf("file_name is: %s
    ",file_name);
    17     return 0;
    18 }

    执行结果:file_name is: ./download/10

    如果将代码2的第14行注释掉,同时修改15行代码为:snprintf(file_name, sizeof(file_name), "%s%d",file_name,i);

    代码执行结果:file_name is: 10

    现在应该明白二者的一个区别了吧,总结为:

    sprintf函数可以直接用于在原有的字符串(不一定是字符串)直接进行拼接;然而snprintf函数不支持直接直接的拼接,需要首先保存好本体。

    欢迎大家指正不对的地方哈

  • 相关阅读:
    教务管理系统(node+express+mysql)
    poj 2485 Highways 超级大水题 kruscal
    HDU 1874 畅通工程续 + HDU 2544 最短路 最短路水题,floyd水
    HEX格式转BIN格式 MOT格式转BIN格式
    html的标签一共有多少个?
    同时存在n个线程(n>5),需要写入或者读取一个名为test.txt的文件
    poj 1258 AgriNet 水题三连发。。。又是kruscal
    招投标专家库
    poj 1789 kruscal水题
    仿Word自动套用格式,用CSS设置表格样式
  • 原文地址:https://www.cnblogs.com/xudashu/p/3559575.html
Copyright © 2011-2022 走看看