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函数不支持直接直接的拼接,需要首先保存好本体。

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

  • 相关阅读:
    Linux下Java环境安装
    Go语言学习之10 Web开发与Mysql数据库
    Go语言学习之9 网络协议TCP、Redis与聊天室
    Redis入门指南之三(入门)
    Redis入门指南之一(简介)
    Go语言学习之8 goroutine详解、定时器与单元测试
    Redis入门指南之二(安装及配置)
    Go语言学习之7 接口实例、终端文件读写、异常处理
    Go语言学习之6 反射详解
    Go语言学习之5 进阶-排序、链表、二叉树、接口
  • 原文地址:https://www.cnblogs.com/xudashu/p/3559575.html
Copyright © 2011-2022 走看看