You probably want something like this:
void excmd(const char* cmd, ...) { char *buf = NULL; va_list args; va_start(args, cmd); int sizeneeded = vsnprintf(buf, 0, cmd, args) + 1; va_end(args); buf = malloc(sizeneeded); va_start(args, cmd); vsnprintf(buf, sizeneeded, cmd, args); va_end(args); system(buf); free(buf); }
or
void excmd(const char* cmd, ...) { va_list args; va_start(args, cmd); int sizeneeded = vsnprintf(NULL, 0, cmd, args) + 1; va_end(args); char buf[sizeneeded]; va_start(args, cmd); vsnprintf(buf, sizeneeded, cmd, args); va_end(args); system(buf); }
vprintf(and family) reference. Pay close attention to what thevsnprintffunction returns, especially if the buffer is a null pointer and the size is zero.