sprintf_s的使用
int?sprintf_s(char?*restrict?buffer, rsize_t bufsz,
? ? ? ? ? ? ??const?char?*restrict?format, ...);
將數(shù)據(jù)格式化輸出到字符串,sprintf_s()是sprintf()的安全版本,通過指定緩沖區(qū)長度來避免sprintf()存在的溢出風(fēng)險(xiǎn)。
sprintf_s原先只有windows的編譯器才只支持,并不是C中的標(biāo)準(zhǔn)函數(shù)。
在C11標(biāo)準(zhǔn)中加入了對該函數(shù)的支持,但是是可選的,并非強(qiáng)制加入。
C11中規(guī)定,如果編譯器實(shí)現(xiàn)了__STDC_LIB_EXT1__ 宏,那么就要支持對該函數(shù)的實(shí)現(xiàn)。
gcc編譯器只是部分的支持C11標(biāo)準(zhǔn),本人測試在ubuntu的gcc 5.4.0版本中也沒有實(shí)現(xiàn)__STDC_LIB_EXT1__ 。
gcc中可以用snprintf函數(shù)簡單替代sprintf_s,但是注意2者在實(shí)現(xiàn)上是有一定的區(qū)別,不是完全相同。
int?snprintf(?char?*restrict?buffer,?int?bufsz,?
? ? ? ? ? ? ??const?char?*restrict?format, ...?);
?
C11原文如下:
__STDC_LIB_EXT1__ The integer constant 201ymmL, intended to indicate support
for the extensions defined in annex K (Bounds-checking interfaces).
Implementations that do not define __STDC_LIB_EXT1__ are not required to conform to these
specifications.
?
C++網(wǎng)站給出的使用建議如下:
As all bounds-checked functions,?printf_s,?fprintf_s,?sprintf_s, and?snrintf_s?
are only guaranteed to be available if?__STDC_LIB_EXT1__?is defined by the implementation
and if the user defines?__STDC_WANT_LIB_EXT1__?to the integer constant?1?before including?<stdio.h>.
??
參考用法如下:
#if defined(__STDC_LIB_EXT1__)#if (__STDC_LIB_EXT1__ >= 201112L)#define __STDC_WANT_LIB_EXT1__ 1 /* Want the ext1 functions */#endif #endif#include <stdlib.h> #include <string.h> #include <stdio.h>#if (__STDC_WANT_LIB_EXT1__ == 1)char tempArray[20];sprintf_s(tempArray, 20, "Int %d", 1); #endif?Windows的中用法如下:
#if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)sprintf_s(...) #elsesprintf(...) #endif?
轉(zhuǎn)載于:https://www.cnblogs.com/dirt2/p/6104198.html
總結(jié)
以上是生活随笔為你收集整理的sprintf_s的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Uva 10917
- 下一篇: [教程] [承風雅傳HSU]用ES4封裝