我的程序在多个平台上运行。其中,Windows CE。目前,sprintf被广泛使用,导致缓冲区溢出等问题很多。我想用snprintf调用替换它们。对于Visual Studio,我发现了这个问题,它解决了问题的win32部分:
snprintf and Visual Studio 2010
但我无法让它适用于Windows CE,因为函数_vsnprintf_s
和_vscprintf
以及常量_TUNCATE
不可用。有没有人知道在Windows CE上复制snprintf(linux)行为的方法?
答案 0 :(得分:1)
到目前为止,我已经完成了以下功能:
int my_snprintf(char* str, size_t size, const char* format, ...)
{
int len = 0;
va_list ap;
if (size == 0)
{
return 0;
}
va_start(ap, format);
len = _vsnprintf(str, size, format, ap);
va_end(ap);
if (len < 0 || len >= size)
{
len = size - 1;
}
if (size > 0)
{
str[size - 1] = '\0';
}
return len;
}
初步测试看起来没问题,甚至可以为WinCE编译..任何反馈都非常感谢
答案 1 :(得分:0)
我认为,您可以使用Microsoft特定的printf_s
功能。我不确定它是100%兼容的,我认为当size为0时它不允许缓冲区为空,但它可能足以满足您的要求......我没有VS2010来确认{{1}在Windows CE版本中存在。
答案 2 :(得分:0)
Windows CE下的_snprintf:
http://msdn.microsoft.com/en-us/library/ms861145.aspx
但其行为与标准略有不同,请阅读:Is snprintf() ALWAYS null terminating?