22

MSVC 的“安全”sprintf函数有一个“知道”目标缓冲区大小的模板版本。bytes然而,这段代码在...结束后愉快地在堆栈上绘制了 567890

char bytes[5];
_snprintf_s( bytes, _TRUNCATE, "%s", "1234567890" );

知道我做错了什么,还是这是一个已知的错误?

(我在 VS2005 中工作——在 2008 年或 2010 年没有测试过)

4

3 回答 3

21

它似乎是Visual C++ 2005 中的一个错误(我无法访问该链接;Google 也将其缓存)。

我能够在 Visual C++ 2005 中重现该问题。在 Visual C++ 2008 和 2010 中,字符串被正确截断(bytes包含1234\0)并按-1预期返回。

于 2010-04-29T14:50:32.950 回答
1

这个例子确实是正确的。截至版本——

Microsoft Visual Studio 2005
Version 8.0.50727.867 (vsvista.050727-8600)
...
Visual C++ 77626-009-0000007-41722

-- 其中包括 SP1、vista 修补程序和一些库修补程序 -- 上述功能

template <size_t size>
int _snprintf_s(
   char (&buffer)[size],
   size_t count,
   const char *format [,
      argument] ... 
);

仍然是越野车。然而,真正令人着迷的是,只有4 个变体函数中的这个函数

  • 好的:int _snprintf_s(char *buffer, size_t sizeOfBuffer, size_t count, :::
  • 越野车:template <size_t size> int _snprintf_s(char (&buffer)[size], size_t count, :::
  • OK:(int _snwprintf_s宽字符版)
  • OK:(template <size_t size> int _snwprintf_s是的,宽字符版OK)

是错误的,也就是说,如果一个人使用非模板版本就可以了,如果一个人使用任何一个宽字符版本也可以。惊人的。

于 2012-10-25T18:10:50.460 回答
-6

例子是错误的。

代码应该是:

char bytes[5];
_snprintf_s( bytes, 5, _TRUNCATE, "%s", "1234567890" );

对于错误的代码,可能是编译器没有给出任何警告的错误,但这将是对 snprintf 的弱检查。

于 2012-02-02T21:32:48.877 回答