6.14.2 va_arg Macro

Gets the next argument in a variable argument list represented by a va_list object.

Include

<stdarg.h>

Prototype

type va_arg(va_list ap, type)

Arguments

ap
pointer to list of arguments
type
type of argument to be retrieved

Return Value

Returns the next argument in the argument list represented by ap with the type specified as the second argument.

Remarks

The ap object must have been initialized by calls to either va_start or va_copy before va_arg can be used. If there is no next argument available or it is not of the type requested, the behavior is undefined.

Example

See the notes at the beginning of this chapter or section for information on using printf() or scanf() (and other functions reading and writing the stdin or stdout streams) in the example code.

#include <stdio.h>
#include <stdarg.h>

void tprint(const char *fmt, ...)
{
  va_list ap;

  va_start(ap, fmt);
  while (*fmt)
  {
    switch (*fmt)
    {
      case '%':
            fmt++;
            if (*fmt == 'd')
            {
              int d = va_arg(ap, int);
              printf("<%d> is an integer\n",d);
            }
            else if (*fmt == 's')
            {
              char *s = va_arg(ap, char*);
              printf("<%s> is a string\n", s);
            }
            else
            {
              printf("%%%c is an unknown format\n",
                   *fmt);
            }
            fmt++;
            break;
      default:
            printf("%c is unknown\n", *fmt);
            fmt++;
            break;
    }
  }
  va_end(ap);
}
int main(void)
{
  tprint("%d%s.%c", 83, "This is text.", 'a');
}

Example Output

<83> is an integer
<This is text.> is a string
. is unknown
%c is an unknown format