std::vprintf, std::vfprintf, std::vsprintf, std::vsnprintf

Header: <cstdio>

Loads the data from the locations, defined by vlist, converts them to character string equivalents and writes the results to a variety of sinks.

# Declarations

int vprintf( const char* format, std::va_list vlist );
int vfprintf( std::FILE* stream, const char* format, std::va_list vlist );
int vsprintf( char* buffer, const char* format, std::va_list vlist );
int vsnprintf( char* buffer, std::size_t buf_size, const char* format, std::va_list vlist );

(since C++11)

# Parameters

# Notes

All these functions invoke va_arg at least once, the value of arg is indeterminate after the return. These functions do not invoke va_end, and it must be done by the caller.

# Example

#include <cstdarg>
#include <cstdio>
#include <ctime>
#include <vector>
 
void debug_log(const char *fmt, ...)
{
    std::time_t t = std::time(nullptr);
    char time_buf[100];
    std::strftime(time_buf, sizeof time_buf, "%D %T", std::gmtime(&t));
    std::va_list args1;
    va_start(args1, fmt);
    std::va_list args2;
    va_copy(args2, args1);
    std::vector<char> buf(1 + std::vsnprintf(nullptr, 0, fmt, args1));
    va_end(args1);
    std::vsnprintf(buf.data(), buf.size(), fmt, args2);
    va_end(args2);
    std::printf("%s [debug]: %s\n", time_buf, buf.data());
}
 
int main()
{
    debug_log("Logging, %d, %d, %d", 1, 2, 3);
}

# See also