sprintf_s、_snprintf与_snprintf_s

一、函数原型

1、sprintf_s

       int sprintf_s(

       char *buffer,

       size_t sizeOfBuffer,

       const char *format[,argument]...);

       int sprintf_s(

       char (&buffer)[size],

       const char *format[,argument]...);//C++only

2、_snprintf

      int _snprintf(

      char *buffer,

      sizet_t count,

      const char* format [,argument]...);

      int _snprintf(

      char (&buffer)[size],

      sizet_t count,

      const char* format [,argument]...);//C++ only

3、_snprintf_s

      int _snprintf_s(

      char *buffer,

      size_t sizeOfBuffer,

      sizet_t count,

      const char* format [,argument]...);

      int _snprintf_s(

     char (&buffer)[size],

     sizet_t count,

     const char* format [,argument]...);//C++ only

、_snprintf_s为何在sizeOfBuffer的基础上多添加一个count

       _snprintf_s为何在sizeOfBuffer的基础上多添加一个count?count似乎是用来控制理想的宽度的。如果得到的字符串超过了count,于是会被截断到count的长度后面再加一个null-terminate。当然,更改的优先级还是sizeOfBuffer。如果应该输出的字符串大小达到了sizeOfBuffer,那么就溢出了,溢出情况下,函数把这个当成一个错误,会把buffer缓冲区置为一个空的字符串。而_snprintf_s的好处就是有了count参数,输出的字符串就算超过了count缓冲区得长度,仍然会有输出,输出字符串被截断到count大小,在这个大小的字符串后面加null-terminate当然如果count设置的和sizeOfBuffer一样大或者更大,就失去了作用。如果输出的字符串超过了sizeOfBuffer,缓冲区仍然被置为空字符串。因此希望缓冲区被尽量利用,可以将count参数设置为_TRUNCATE,这样实际效果是count=sizeOfBuffer-1.

三、sprintf_s与_snprintf

     在C语言环境下,sprintf_s与_snprintf的对比,_snprintf使用的参数是count,而sprintf_s使用的sizeOfBuffer,这就很能说明问题。如果输出的字符串刚好达到count,那么字符串不能截断,调用_snprintf的时候需要注意返回值,如果返回值不是正数,那么还得注意你的字符缓冲区并不是null-terminate结尾的。总结来说,sprintf_s在缓冲区不够大时会失败,失败时缓冲区中是一个空字符串。_snprintf不会失败,但是如果缓冲区不够大,缓冲区得内容不是null-terminate,必须自己注意字符串的结束,而_snprintf_s结合了两者的优点。


转载:

http://blog.csdn.net/wayne_hust/article/details/8285088

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值