C snprintf的输出是否保证在Visual Studio 2015中以空终止?

C snprintf的输出是否保证在Visual Studio 2015中以空终止?,c,visual-studio-2015,c99,C,Visual Studio 2015,C99,我正在使用我的前任使用的C代码库: #ifdef _MSC_VER // Map to equivalent function #define snprintf sprintf_s #endif 代码库需要在Linux(gcc/clang)、OSX(gcc/clang)和Windows(VS)上编译。我第一次尝试在Visual Studio 2015中编译代码。以前使用的是Visual Studio 2010。我遇到了描述的错误,并且能够使用接受答案中的线索进行编译: #ifdef _

我正在使用我的前任使用的C代码库:

#ifdef _MSC_VER
  // Map to equivalent function
  #define snprintf sprintf_s
#endif
代码库需要在Linux(gcc/clang)、OSX(gcc/clang)和Windows(VS)上编译。我第一次尝试在Visual Studio 2015中编译代码。以前使用的是Visual Studio 2010。我遇到了描述的错误,并且能够使用接受答案中的线索进行编译:

#ifdef _MSC_VER
  #if _MSC_VER<1900
    #define snprintf sprintf_s
  #endif
#endif
我用Visual Studio 2015在OSX和Windows上构建并运行了该程序

在OSX上,输出为:

~$c99 main.c
~$./a.out 
buffer: abcd
size of buffer: 4
last character a null terminator?: yes
在使用Visual Studio 2015的Windows 7上,输出为

> printf_evaluation.exe
buffer: abcd
size of buffer: 4
last character a null terminator?: yes
这难道不能证明输出实际上以null结尾,并表明MSDN文档不正确吗?我的例子是不是太琐碎了?是否存在使用Visual Studio 2015时,
snprintf
的输出可能不会以NULL结尾的情况?

将始终以nul结尾,只要缓冲区的第二个参数大于零。因此,是的,MSDN文档是错误的

snprintf函数等同于fprintf,只是输出 写入数组(由参数s指定)而不是 小溪如果n为零,则不写入任何内容,s可能为空 指针。否则,超过n-1的输出字符将被删除 丢弃而不是写入数组,并且为空字符 是写在实际写入的字符的末尾 数组。如果在重叠的对象之间进行复制,则 行为是未定义的


(强调我的)。

我想,他们的意思是不同于snprintf,它确实不会空终止。VS根本不知道snprintf(除了作为sprintf_s的宏之外),我怀疑这是一个文档错误,而不是visual studio中实现
snprintf()
的任何异常/错误;这是所有这些问题的根源。IDK when(如果有)VS runtime将被更新为使用C99版本。MS从未做出任何努力来遵守C99-是什么让您认为“Visual Studio包含了符合C99的snprintf版本”?建议,以验证实际发生的情况。。。。编写一个小程序,将“超长”缓冲区传递给snprintf(),然后使用调试器查看结果缓冲区中实际放置的内容。MSDN文档将描述MS工具的行为,这可能不同于ISO C标准。恕我直言,MS从未声称支持C99(更不用说C11了)请参见:snprintf和vsnprintf现已实现:C99 snprintf和vsnprintf函数已实现。@M.M我使用MSVC 9.0和15.0运行了该示例。前一个编译器没有
snprintf
\u snprintf
,使用后一个编译器生成的代码向字符串写入了5个字符,并且没有终止它。然而,MSVC15.0确实有
snprintf
,其行为如OP所说。的MSVC文档说明“此函数不保证空终止”,并且该文档集未提及
snprintf
。是的,有一个文档错误,两个版本的
snprintf
\snprintf
表现不一样。
> printf_evaluation.exe
buffer: abcd
size of buffer: 4
last character a null terminator?: yes