I've asked the same question about strncpy
, but there the string
ends up containing the whole input string. When passing a string to vsnprintf
the last character always gets chopped off: https://rextester.com/UIQMX91570
For simplicity I've also included the live example link above inline in the code:
void bar(const char* format, va_list vlist) {
const auto buf_size = vsnprintf(nullptr, 0U, format, vlist);
string buffer(buf_size, '\0');
vsnprintf(data(buffer), buf_size, format, vlist);
cout << data(buffer) << endl;
}
void foo(const char* format, ...) {
va_list vlist;
va_start(vlist, format);
bar(format, vlist);
va_end(vlist);
}
If I call this with: foo("lorem ipsum %d", 13)
the output I get is:
lorem ipsum 1
Where as I would have expected: lorem ipsum 13
Can anyone explain the discrepancy? When I debug I get a buf_size
of 14 which should be enough to contain the entire string, yet it does not :(
Because man page clearly says that
If you'd check the return value of your second
vsnprintf
call, you'd see that return value is equal to the size, as in the man page:The
buf_size
parameter tovsnprintf
specifies how many characters to write, including the terminating NUL character. The return value is the number of characters produced, not including the terminating NUL character.You want
Because their documented behavior is different.
strncpy()
but
vsnprintf()
emphasis is mine.