### Question 15.4

How can I write a function that takes a variable number of arguments?

Use the facilities of the `<stdarg.h>` header.

Here is a function which concatenates an arbitrary number of strings into `malloc`'ed memory:

    #include <stdlib.h>		/* for malloc, NULL, size_t */
    #include <stdarg.h>		/* for va_ stuff */
    #include <string.h>		/* for strcat et al. */

    char *vstrcat(char *first, ...)
    {
    	size_t len;
    	char *retbuf;
    	va_list argp;
    	char *p;

    	if(first == NULL)
    		return NULL;

    	len = strlen(first);

    	va_start(argp, first);

    	while((p = va_arg(argp, char *)) != NULL)
    		len += strlen(p);

    	va_end(argp);

    	retbuf = malloc(len + 1);	/* +1 for trailing \0 */

    	if(retbuf == NULL)
    		return NULL;		/* error */

    	(void)strcpy(retbuf, first);

    	va_start(argp, first);		/* restart for second scan */

    	while((p = va_arg(argp, char *)) != NULL)
    		(void)strcat(retbuf, p);

    	va_end(argp);

    	return retbuf;
    }

Usage is something like

    	char *str = vstrcat("Hello, ", "world!", (char *)NULL);

Note the cast on the last argument; see questions 5.2 and 15.3. (Also note that the caller must free the returned, `malloc`'ed storage.)

See also question 15.7.

References: K&R2 Sec. 7.3 p. 155, Sec. B7 p. 254
ANSI Sec. 4.8
ISO Sec. 7.8
Rationale Sec. 4.8
H&S Sec. 11.4 pp. 296-9
CT&P Sec. A.3 pp. 139-141
PCS Sec. 11 pp. 184-5, Sec. 13 p. 242

Read sequentially: prev next up top

This page by Steve Summit // Copyright 1995 // mail feedback