• 【字符串处理函数】sprintf与snprintf


    1、功能

    1.1 sprintf

      主要功能是把格式化的数据写入某个字符串中,即发送格式化输出到 string 所指向的字符串。
      主要功能是把格式化的数据写入某个字符串中,即发送格式化输出到 string 所指向的字符串。

    1.2 snprintf

    将可变个参数(…)按照format格式化成字符串,然后将其复制到str中。
      (1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符(‘\0’);
      (2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符(‘\0’),返回值为欲写入的字符串长度。

    2、函数说明

    2.1 sprintf

    2.1.1 函数原型

    int sprintf(char *string, char *format [,argument,...]);
    
    • 1

    2.1.2 参数列表:

       string:这是指向一个字符数组的指针,该数组存储了最终格式化后的 字符串。
       format:指明字符串的格式,包含了要被写入到字符串 str 的文本。它可以嵌入随后的附加参数中指定的值替换(如(“%d%c%f”, num, chr, f),参数的个数应与 % 标签的个数相同。),按需求进行格式化。
       [argument]…:根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签,如(“%d%c%f”, num, chr, f)。参数的个数应与 % 标签的个数相同。

    2.1.3 返回值:

       如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。
       sprintf 返回以format为格式argument为内容组成的结果被写入string的字节数,结束字符‘\0’不计入内。即,如果“Hello”被写入空间足够大的string后,函数sprintf 返回5。

    2.2 snprintf

    2.2.1 函数原型

    int snprintf(char* dest_str,size_t size,const char* format,...);
    
    • 1

    2.2.2 参数列表:

       dest_str:这是指向一个字符数组的指针,该数组存储了最终格式化后的 字符串。
       size:对格式化字符串的长度做出限制,
       format:指明字符串的格式,包含了要被写入到字符串 str 的文本。它可以嵌入随后的附加参数中指定的值替换(如(“格式化为%d%c%f”, num, chr, f)),按需求进行格式化。

    2.2.3 返回值

       若成功则返回预写入的字符串长度,若出错则返回负值。
       与snprintf的返回值不同,sprintf的返回值是成功写入的字符串长度,此处需要谨慎处理。

    3、区别

      (1)从函数命名上 snprintf 比 sprintf多出了一个n,函数定义上,多出了第二个参数n 用来控制输出字符的最大数量,其控制生成的字符长度最多为n-1,为附加的终止空字符留出空间。
      (2)因此 snprintf 是一个较为安全的函数,相比 sprintf 它可以避免缓冲区溢出问题, 如果输出的字符长度超过 n,它可以被自动截断。
      (3)在函数的返回值上,snprintf 和 sprintf 返回的都是 预期被写入到缓冲区的字符串长度(不包括终止符)。 对于snprintf来说,由于支持长度限制、自动截断的能力,因此它的返回值可能比实际写入到缓冲区的长度大。

    4、Demo

    4.1 sprintf

    #include 
    int main( void )
    {
       char  buffer[200]char s[] = "hello world";//字符串数组
       char c = 'c';//字符
       int  i = 8;//整型
       int  length;
       float fp = 3.1415926f;//浮点型
       // 格式化并打印各种数据到buffer
       length  = sprintf( buffer,    "   String:    %s\n", s ); // 字符串数组
       length += sprintf( buffer + length  , "   Character: %c\n", c ); // 字符
       length += sprintf( buffer + length  , "   Integer:   %d\n", i ); // 整型
       length += sprintf( buffer + length  , "   Float:     %f\n", fp );// 浮点型
        
       printf( "Output:\n%s\ncharacter string_length = %d\n", buffer, length);
       return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    输出结果:
    输出结果

    4. 2 snprintf

    #include
    #include
    int main()
    {
      char str[10]={0};
      int str_len=snprintf(str,sizeof(str),"123456789012345678");
      printf("str = %s\n",str);
      printf("write_len = %d\n",strlen(str));//打印格式化字符串的实际长度
      printf("str_len = %d\n",str_len);//打印snprintf返回值
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

      编译警告:从编译警告可以看出snprintf所发挥的作用,当要格式化的字符串超出buffer长度时,snprintf函数的size参数就可以起到避免溢出的效果.
      而如果此时使用sprintf,就会造成buffer溢出。
    编译警告
    输出结果:
    在这里插入图片描述

  • 相关阅读:
    荐读 | 图计算的查询模式有哪些?
    海康Visionmaster-通讯管理:使用 Modbus TCP 通讯 协议与流程交互
    C++实现高频设计模式
    java的优缺点
    C#判断字符串的显示宽度
    Matlab安装完成后打开后闪退
    【活动报名】11月19日 | AI GC 的技术与应用构建
    C++ Reference: Standard C++ Library reference: Containers: deque: deque: empty
    数据安全是什么?如何保障数据的安全?
    基础算法篇——归并排序
  • 原文地址:https://blog.csdn.net/anmo_moan/article/details/126387043