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 :(
Can anyone explain the discrepancy?
Because their documented behavior is different.
If count is reached before the entire array src was copied, the resulting character array is not null-terminated.
but vsnprintf()
At most buf_size-1 characters are written. The resulting character string will be terminated with a null character, unless buf_size is zero.
emphasis is mine.