我目前正在将我们的一个 Linux 库的代码转换为 Windows DLL。
在这个库中,我有一个函数,它以 printf 方式(格式字符串,
然后省略号)。在这个函数中,我使用 vsnprintf 来格式化提供的参数。
因为我想知道是否可以将最终字符串塞入一个小缓冲区中,或者是否必须分配
内存,我有兴趣确定格式化字符串的“长度”。
为此,我目前正在使用这样的 vsnprintf(显然是编写示例代码):
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
void foo(const char* fmt, ...)
{
int len = 0;
va_list ap;
va_start(ap, fmt);
len = vsnprintf(0, 0, fmt, ap);
printf("len = %d\n", len);
va_end(ap);
}
int main(void)
{
foo("12345%s", "67890");
exit(0);
}
Open Group Base Specifications Issue 6 涵盖了这种用法:
当我在 Windows 系统(Visual Studio 2010)上使用/analyze 编译此代码时出现了问题。编译器/分析器给了我以下信息:
快速浏览一下 MSDN entry for vsnprintf 给了我这个:
奇怪的是,上面的示例仍然“按预期”在 Windows 上工作(即它返回给我将写入的字符数)。
但是由于我不希望这依赖于未指定的东西,我想知道是否有更好的官方方法来实现相同的目标,而不必希望这不会在将来的某个版本中中断。
谢谢你的时间!
最佳答案
Hans Passant 在评论中提供的答案:
记录在案的 _vscprintf 在 Windows 上提供了此功能,
因此,没有必要依赖“未指定的行为”。
关于c - Unix 到 Windows : Alternative to vsnprintf to determine length?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8488671/