C++中sprintf_s与sprintf的不同

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zyazky/article/details/52180458

今天在程序编译时遇到一个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提高安全性防止数组越界,还是挺好的。


展开阅读全文

没有更多推荐了,返回首页