sprintf

您所在的位置:网站首页 sprintf_s报错 sprintf

sprintf

2024-05-20 04:11| 来源: 网络整理| 查看: 265

int sprintf_s(char *restrict buffer, rsize_t bufsz,              const char *restrict format, ...);

将数据格式化输出到字符串,sprintf_s()是sprintf()的安全版本,通过指定缓冲区长度来避免sprintf()存在的溢出风险。

sprintf_s原先只有windows的编译器才只支持,并不是C中的标准函数。

在C11标准中加入了对该函数的支持,但是是可选的,并非强制加入。

C11中规定,如果编译器实现了__STDC_LIB_EXT1__ 宏,那么就要支持对该函数的实现。

gcc编译器只是部分的支持C11标准,本人测试在ubuntu的gcc 5.4.0版本中也没有实现__STDC_LIB_EXT1__ 。

gcc中可以用snprintf函数简单替代sprintf_s,但是注意2者在实现上是有一定的区别,不是完全相同。

int snprintf( char *restrict buffer, int bufsz,               const char *restrict format, ... );

 

C11原文如下:

__STDC_LIB_EXT1__ The integer constant 201ymmL, intended to indicate supportfor the extensions defined in annex K (Bounds-checking interfaces).Implementations that do not define __STDC_LIB_EXT1__ are not required to conform to thesespecifications.

 

C++网站给出的使用建议如下:

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 .

  

参考用法如下:

#if defined(__STDC_LIB_EXT1__) #if (__STDC_LIB_EXT1__ >= 201112L) #define __STDC_WANT_LIB_EXT1__ 1 /* Want the ext1 functions */ #endif #endif #include #include #include #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(...) #else sprintf(...) #endif

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3