I understand that the difference between the printf
, fprintf
, sprintf
etc functions and the vprintf
, vfprintf
, vsprintf
etc functions has to do with how they deal with the function arguments. But how specifically? Is there really any reason to use one over the other? Should I just always use printf
as that is a more common thing to see in C, or is there a legitimate reason to pick vprintf
instead?

- 37,678
- 39
- 126
- 176
-
I recommend adding the tags "printf" and "variadic-functions" to your question. – Gabriel Staples Jul 25 '18 at 19:10
4 Answers
printf()
and friends are for normal use. vprintf()
and friends are for when you want to write your own printf()
-like function. Say you want to write a function to print errors:
int error(char *fmt, ...)
{
int result;
va_list args;
va_start(args, fmt);
// what here?
va_end(args);
return result;
}
You'll notice that you can't pass args
to printf()
, since printf()
takes many arguments, rather than one va_list
argument. The vprintf()
functions, however, do take a va_list
argument instead of a variable number of arguments, so here is the completed version:
int error(char *fmt, ...)
{
int result;
va_list args;
va_start(args, fmt);
fputs("Error: ", stderr);
result = vfprintf(stderr, fmt, args);
va_end(args);
return result;
}

- 73,191
- 16
- 130
- 183
-
3Of course, then you want a `warn()` function that works like `error()` but prints "Warning: " instead, so you create your _own_ `vprintf()` style function: `int verror(char *prefix, char *fmt, va_list args);` and have `error()` call that with "Error: " and `warn()` call it with "Warning: " but it's all semantics. – Chris Lutz Sep 28 '09 at 07:20
-
2time to learn about variadic functions! This answer cleared things up, thank you. – Carson Myers Sep 28 '09 at 07:43
-
Note: the 'v' stands for "variadic". Knowing that is useful to help me remember what the `vprintf` functions even are, since reminding myself what the 'v' stands for also reminds me what these functions are for. More on "variadic" here: https://en.wikipedia.org/wiki/Variadic_function. – Gabriel Staples Jan 12 '19 at 06:53
You never want to use vprintf()
directly, but it's incredibly handy when you need to e.g. wrap printf()
. For these cases, you will define the top-level function with variable arguments (...). Then you'll collect those into a va_list
, do your processing, and finally call vprintf()
on the va_list
to get the printout happening.

- 391,730
- 64
- 469
- 606
The main difficulty with variadic arguments is not that there is a variable number of arguments but that there is no name associated with each argument. The va_start, va_arg macros parse the arguments in memory (in most C compilers they are on the stack) using the type information contained in the format string cf. Kernighan and Ritchie, second edition, section 7.3.

- 157
- 2
- 6
This example shows the elegance of Python. Since C/C++ cannot reconcile the difference between int error(char *fmt, ...)
and int error(char *fmt, va_list ap)
, thus, for every function *printf
, it has to create two versions, i.e., one taking in ...
, the other taking in va_list
, this essentially doubles the total number of functions. In Python, you can use *list()
or **dict()
to pass in a va_list
as ...
.
Hopefully, future C/C++ can support this kind of argument processing scheme.

- 1,412
- 16
- 17