MSVC 的“安全”sprintf
函数有一个“知道”目标缓冲区大小的模板版本。bytes
然而,这段代码在...结束后愉快地在堆栈上绘制了 567890
char bytes[5];
_snprintf_s( bytes, _TRUNCATE, "%s", "1234567890" );
知道我做错了什么,还是这是一个已知的错误?
(我在 VS2005 中工作——在 2008 年或 2010 年没有测试过)
MSVC 的“安全”sprintf
函数有一个“知道”目标缓冲区大小的模板版本。bytes
然而,这段代码在...结束后愉快地在堆栈上绘制了 567890
char bytes[5];
_snprintf_s( bytes, _TRUNCATE, "%s", "1234567890" );
知道我做错了什么,还是这是一个已知的错误?
(我在 VS2005 中工作——在 2008 年或 2010 年没有测试过)
它似乎是Visual C++ 2005 中的一个错误(我无法访问该链接;Google 也将其缓存)。
我能够在 Visual C++ 2005 中重现该问题。在 Visual C++ 2008 和 2010 中,字符串被正确截断(bytes
包含1234\0
)并按-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, :::
int _snwprintf_s
宽字符版)template <size_t size> int _snwprintf_s
是的,宽字符版OK)是错误的,也就是说,如果一个人使用非模板版本就可以了,如果一个人使用任何一个宽字符版本也可以。惊人的。
例子是错误的。
代码应该是:
char bytes[5];
_snprintf_s( bytes, 5, _TRUNCATE, "%s", "1234567890" );
对于错误的代码,可能是编译器没有给出任何警告的错误,但这将是对 snprintf 的弱检查。