C++中sprintf_s与sprintf的不同

今天在程序编译时遇到一个warning,

:\convertmnist\convertmnist\mnist.cpp(72): warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

1>          d:\vs2010\vc\include\stdio.h(371) : 参见“sprintf”的声明

所以就来看一下C++中sprintf_s与sprintf有什么不同!

sprintf_s是一个函数,函数功能:将数据格式化输出到字符串。

函数原型:
int sprintf_s(
char *buffer,
size_t sizeOfBuffer,
const char *format [,
argument] ...
);
sprintf_s()是sprintf()的安全版本,通过指定 缓冲区长度来避免sprintf()存在的溢出风险
相关函数:
int sprintf( char *buffer, const char *format [, argument] … );
int vsprintf( char *buffer, const char *format, va_list argptr );
int _sprintf_s_l(
char *buffer,
size_t sizeOfBuffer,
const char *format,
locale_t locale [,
argument] ...
);
int swprintf_s(
wchar_t *buffer,
size_t sizeOfBuffer,
const wchar_t *format [,
argument]...
);
int _swprintf_s_l(
wchar_t *buffer,
size_t sizeOfBuffer,
const wchar_t *format,
locale_t locale [,
argument]…
);
template <size_t size>
int sprintf_s(
char (&buffer)[size],
const char *format [,
argument] ...
); // C++ only
template < size_t size>
int swprintf_s(
wchar_t (&buffer)[size],
const wchar_t *format [,
argument]...
); // C++ only
sprintf_s和sprintf的主要不同是sprintf_s对于格式化string中的格式化的字符的有效性进行了检查,而sprintf仅仅检查格式化string或者缓冲区是否是空指针。如果有错误则返回相应的错误代码。
另一个不同,sprintf_s也携带着接收格式化字符串的缓冲区的大小。如果,格式化字符串过大,则sprintf_s会返回一个空string和设置无效参数句柄为激活。与snprintf不同,sprintf_s不会保证缓冲区为以null结尾,除非,缓冲区的大小为0。
sprintf_s将格式化字符串存到缓冲区,并在下一个位置填充Null后将格式化字符串未占用的缓冲区(Null之后的Buffer)全部填充为-3,而sprintf却不会填充而是保持缓冲区中未占用的存储位置上的数据。
当然也有人表示反感,好讨厌这个sprintf_s 以前学VC6的时候都是用sprintf格式化字符串,用了VS2015的版本后sprintf就不可以用了,只能用sprintf_s说这安全性更高,如果是正常的char[]数组格式化就没事通过,当要将char*格式化的时候编译就不通过,只能将char*转换成char[]然后再用sprintf_s,这样就变得好麻烦了,各位大神有木有更简便的方法,或者函数来格式化字符指针……
解决方法:1.你可以在建项目的时候把安全编译去了。。
       #pragma warning(disable:4996)
       ...
       2. 你可以定义  _CRT_SECURE_NO_WARNINGS ,然后继续使用 sprintf 
                     3.你可以用 std::stringstream
不过个人认为微软搞这些函数加s提高安全性防止数组越界,还是挺好的。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值