什么时候vsnprintf可以返回0?

时间:2017-08-08 09:52:12

标签: 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_end(ap);
    printf("length is %d\n", length);
}

int main()
{
    func(10,"abcd");
    return 0;
}

2 个答案:

答案 0 :(得分:1)

来自Microsoft's docs

  

vsnprintf函数返回写入的字符数,而不是   计算终止空字符。如果指定了缓冲区大小   by count不足以包含指定的输出   formatargptr vsnprintf的返回值是。{   如果要编写的字符,不计算空字符   数量足够大。如果返回值大于   count - 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);
}

答案 1 :(得分:0)

当它写入(或写入)的字节数等于0时;换句话说,当它产生(会产生)没有输出时。

Reference

  

返回值

     

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

     

4)成功时写入的字符数,如果发生错误则写入负值。如果由于buf_size限制而导致结果字符串被截断,则函数将返回已写入的字符总数(不包括终止空字节),如果没有强制限制。