sprintf和snprintf用法

1sprintf函数
sprintf函数原型为 intsprintf(char *str, const char *format, ...)。其中的格式控制字符串与printf的格式控制字符串的作用是一样的,表示的是参数的格式,而不是输入到str中的格式。作用是格式化字符串,具体功能如下所示:
1)将数字变量转换为字符串。
2)得到整型变量的16进制和8进制字符串。
3)连接多个字符串。
举例如下所示:

 1    char str[256] = {0};

 2    int data = 1024;

 3    //将data转换为字符串

 4    sprintf(str,"%d",data);

 5    //获取data的十六进制

 6    sprintf(str,"0x%X",data);

 7    //获取data的八进制

 8    sprintf(str,"0%o",data);

 9    constchar *s1 ="Hello";

10    constchar *s2 ="World";

11    //连接字符串s1和s2

12    sprintf(str,"%s %s",s1,s2);

2snprintf函数

snprintf函数是sprintf函数的更加安全版本,考虑到字符串的字节数,防止了字符串溢出。函数形式为:int snprintf(char *restrict buf, size_t n, const char * restrict format, ...);。最多从源串中拷贝n1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n的话,将不会溢出。

源码实现:

glibc-2.18/stdio-common/snprintf.c:

  #include <stdarg.h>

  #include <stdio.h>

  #include <libioP.h>

  #define __vsnprintf(s, l, f, a) _IO_vsnprintf (s, l, f,a)

  /* Write formatted output into S, according to the format

     string FORMAT, writing no more than MAXLENcharacters.  */

  /* VARARGS3 */

  int

  __snprintf (char *s, size_t maxlen, const char *format, ...)

  {

   va_list arg;

    int done;

 

   va_start (arg, format);

   done =__vsnprintf (s, maxlen, format, arg);

   va_end (arg);

 

   return done;

  }

  ldbl_weak_alias (__snprintf, snprintf)

使用_IO_vsnprintf函数实现:

glibc-2.18/libio/vsnprintf.c:

  int

  _IO_vsnprintf(string, maxlen, format, args)

       char *string;

      _IO_size_t maxlen;

       const char *format;

      _IO_va_list args;

{

  _IO_strnfile sf;

  int ret;

#ifdef _IO_MTSAFE_IO

  sf.f._sbf._f._lock = NULL;

#endif

  /* We need to handle the specialcase where MAXLEN is 0.  Use the

      overflowbuffer right from the start.  */

  if (maxlen == 0)

     {

      string = sf.overflow_buf;

       maxlen = sizeof(sf.overflow_buf);

     }

  _IO_no_init (&sf.f._sbf._f, _IO_USER_LOCK, -1, NULL, NULL);

  _IO_JUMPS (&sf.f._sbf) = &_IO_strn_jumps;

  string[0] = '\0';

  _IO_str_init_static_internal (&sf.f, string, maxlen - 1, string);

 ret = _IO_vfprintf (&sf.f._sbf._f, format, args);

  if (sf.f._sbf._f._IO_buf_base != sf.overflow_buf)

    *sf.f._sbf._f._IO_write_ptr = '\0';

  return ret;

}



参考网址:

http://www.cnblogs.com/Anker/p/3351168.html


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值