gpt4 book ai didi

c - snprintf 和 Visual Studio 2010

转载 作者:太空狗 更新时间:2023-10-29 16:14:50 26 4
gpt4 key购买 nike

我很不幸在一个项目中使用 VS 2010,并注意到以下代码仍然无法使用非标准兼容的编译器构建:

#include <stdio.h>
#include <stdlib.h>

int main (void)
{
char buffer[512];

snprintf(buffer, sizeof(buffer), "SomeString");

return 0;
}

(编译失败并出现错误:C3861: 'snprintf': identifier not found)

我记得早在 VS 2005 中就出现过这种情况,我很震惊地发现它仍未得到修复。

有人知道 Microsoft 是否有计划将其标准 C 库移至 2010 年吗?

最佳答案

短篇小说:微软终于在 Visual Studio 2015 中实现了 snprintf。在早期版本中,您可以如下模拟它。


长版:

这是 snprintf 的预期行为:

int snprintf( char* buffer, std::size_t buf_size, const char* format, ... );

Writes at most buf_size - 1 characters to a buffer. The resulting character string will be terminated with a null character, unless buf_size is zero. If buf_size is zero, nothing is written and buffer may be a null pointer. The return value is the number of characters that would have been written assuming unlimited buf_size, not counting the terminating null character.

Visual Studio 2015 之前的版本没有一致的实现。取而代之的是非标准扩展,例如 _snprintf()(它不会在溢出时写入 null 终止符)和 _snprintf_s()(它可以强制执行 null 终止,但在溢出时返回 -1 而不是本应写入的字符数)。

建议的 VS 2005 及更高版本的回退:

#if defined(_MSC_VER) && _MSC_VER < 1900

#define snprintf c99_snprintf
#define vsnprintf c99_vsnprintf

__inline int c99_vsnprintf(char *outBuf, size_t size, const char *format, va_list ap)
{
int count = -1;

if (size != 0)
count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap);
if (count == -1)
count = _vscprintf(format, ap);

return count;
}

__inline int c99_snprintf(char *outBuf, size_t size, const char *format, ...)
{
int count;
va_list ap;

va_start(ap, format);
count = c99_vsnprintf(outBuf, size, format, ap);
va_end(ap);

return count;
}

#endif

关于c - snprintf 和 Visual Studio 2010,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2915672/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com