【字符串处理函数】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,...]);

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,...);

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 <stdio.h>
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;
}

输出结果:
输出结果

4. 2 snprintf

#include<stdio.h>
#include<stdlib.h>
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;
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值