As a learning experience I'm porting some stuff from Windows to MacOS and came across something like this:
void SomeClass::someFunction(const char* format, va_list args) { int size = _vscprintf(format, args); // length after formatting std::string s; s.resize(size); vsprintf(&s[0]); ... } Now, as _vscprintf is Microsoft specific and I haven't found anything similar on Linux I thought I'd ask here.
Let's also assume this code is in some critical path and shouldn't have some extra overhead of heap allocation or such.
What is the recommended replacement for _vscprintf on MacOS/Linux?
Thanks!
22 Answers
You can use vsnprintf instead;
int _vscprintf (const char * format, va_list pargs) { int retval; va_list argcopy; va_copy(argcopy, pargs); retval = vsnprintf(NULL, 0, format, argcopy); va_end(argcopy); return retval; } Thanks to @dbasic for the more complete solution and @j-a for fixing the obvious errors.
5The previous solution is ok but has two bugs:
- The function
va_copyhas one parameter instead of two parameters. - The call to function
vsnprintfdoesn't use theargcopyvariable; it generates a corruption in the stack if you callvsnprintfagain then.
int _vscprintf (const char * format, va_list pargs) { int retval; va_list argcopy; va_copy(argcopy, pargs); retval = vsnprintf(NULL, 0, format, argcopy); va_end(argcopy); return retval; } 2