C++ vsnprintf何时可以返回0?

C++ vsnprintf何时可以返回0?,c++,printf,C++,Printf,何时可以vsnprintf函数返回0?它行为异常,正在返回0。是否存在任何环境依赖关系 #include<stdio.h> #include<stdarg.h> void func(int a,const char *format,...) { int length = 0; va_list ap; va_start(ap, format); length = vsnprintf(NULL, 0, format, ap); va

何时可以
vsnprintf
函数返回
0
?它行为异常,正在返回
0
。是否存在任何环境依赖关系

#include<stdio.h>
#include<stdarg.h>

void func(int a,const char *format,...)
{
    int length = 0;
    va_list ap;

    va_start(ap, format);
    length = vsnprintf(NULL, 0, format, ap);
    va_end(ap);
    printf("length is %d\n", length);
}

int main()
{
    func(10,"abcd");
    return 0;
}
#包括
#包括
void func(整型,常量字符*格式,…)
{
整数长度=0;
va_列表ap;
va_开始(ap,格式);
长度=vsnprintf(NULL,0,格式,ap);
va_端(ap);
printf(“长度为%d\n”,长度);
}
int main()
{
func(10,“abcd”);
返回0;
}

当它已写入(或将写入)的字节数等于0时;换句话说,当它已经(将)没有产出时

:

返回值 1-3)如果成功写入的字符数,如果发生错误则为负值

4) 如果成功写入的字符数,如果发生错误则为负值。如果结果字符串由于buf_大小限制而被截断,则函数将返回在未施加限制的情况下本应写入的字符总数(不包括终止的空字节)

发件人:

vsnprintf
函数返回写入的字符数,而不是 计数终止的空字符。如果指定了缓冲区大小 by count不够大,无法包含由指定的输出
format
argptr
vsnprintf的返回值是 将写入的字符,不包括空字符,如果 数量足够大。如果返回值大于
计数-1
,输出已被截断。返回值
-1
指示发生编码错误

所以它只在不写任何内容时返回零。由于您将缓冲区大小传递为
0
,因此它无法写入任何内容,因此在成功时将始终返回
0

如果要使结果成为其他任何结果,则需要创建缓冲区

void func(int a,const char *format,...)
{
    const int BUFFER_SIZE = 256;
    char buffer[BUFFER_SIZE];
    int length = 0;
    va_list ap;

    va_start(ap, format);
    length = vsnprintf(buffer, BUFFER_SIZE, format, ap);
    va_end(ap);
    printf("length is %d\n", length);
}

对于GCC,您的示例将产生以下警告:
警告:未使用的参数“a”[-Wunused parameter]
。我假设OP对该
a
有特别的计划。注意:“如果count指定的缓冲区大小不够大……vsnprintf的返回值是将要写入的字符数”。因此,如果传入的缓冲区大小为0,则通常
vsnprintf()
不应返回0。您好,我只将4个字符传递给函数。而且在某些环境中,它给出了正确的值。@Rohit:“在某些环境中,它也给出了正确的值”。您是否可以更新问题,详细说明哪些环境具有正确的行为,哪些环境不具有正确的行为?这是一个非常重要的问题。请提供工具链和平台的版本详细信息。您使用的编译器版本是什么?使用VC++2013进行的快速测试显示
vsnprintf()
返回4,而不是0。